首页 文章

Solr - {!ex}在构面查询上

提问于
浏览
7

背景

我正在尝试将两个功能组合起来,这些功能可以单独运行,但却无法让它们协同工作 .

  • 1)如solr wiki中所述,我可以标记特定的fq,然后将其排除在我的facet.field上 . 即使选择一个值,这将使我的方面的计数保持不变,如下所示:
fq={!tag=pt}price:100&facet=true&facet.field={!ex=pt}price
  • 2)我想使用facet.query如下:
facet=true&facet.query=price:[0 TO 100]&facet.query=price:[100 TO *]

所以我想结合* 1和* 2,这是我尝试的:

fq={!tag=pt}price:[0 to 100]&facet=true&facet.query={!ex=pt}price:[0 TO 100]&facet.query={!ex=pt}price:[100 TO *]

实际发生的是我从Solr收到的回复:

<lst name="facet_queries">
    <int name="{!ex=pt}price:[0 TO 100]">8</int>
    <int name="{!ex=pt}price:[100 TO *]">19</int>
</lst>

我的问题是:

为什么名称的{!ex = pt}部分?这搞砸了我的一些逻辑 . 也许我误用了它,如果是的话,那么正确的方法是什么?

更多信息

我期待的是:(如果运行* 2没有* 1,我收到的相同)

<lst name="facet_queries">
    <int name="price:[0 TO 100]">8</int>
    <int name="price:[100 TO *]">19</int>
</lst>

这是有道理的,因为如果我正在运行* 1这就是我在facet_fields中收到的内容:

<lst name="facet_fields">
    <lst name="price">
        <int name="80">8</int>
        <int name="150">19</int>
    </lst>
</lst>

它没有说name =“{!ex = pt}价格”

3 回答

  • 1

    我认为这是因为:

    • *1 示例使用 facet.field ,其名称应与其使用的字段相同(不包含任何信息) .

    • *2 示例使用 facet.query ,它应代表 query (查询中使用的所有可能信息......显示部分查询没有意义,例如不排除部分)


    无论如何,如果需要命名使用排除功能的特定方面,那么可以通过以下方式完成(使用 key 参数):

    facet.field={!ex=pt key=good_name_for_a_facet}price

    facet.query的工作方式相同...例如,如果你想隐藏ex部分:

    facet.query={!ex=pt key=$queryOne}price:[0 TO 100]

    其中queryOne是传递给solr的原始参数的一部分 queryOne=price:[0 TO 100]

    所以最终的查询看起来像这样:

    fq={!tag=pt}price:[0 TO 100]&facet=true&facet.query={!ex=pt key=$queryOne}price:[0 TO 100]&facet.query={!ex=pt key=$queryTwo}price:[100 TO *]&queryOne=price:[0 TO 100]&queryTwo=price:[100 TO *]
    

    附:我已经使用外部参数作为键,因为这样 - 不需要手动转义特殊字符 .

  • 1

    我遇到了这个问题,我通过向{!ex} param添加一个本地param键来解决它 . 所以对于你的例子,我会这样做:

    fq = {!tag = pt}价格:[0到100]&facet = true&facet.query = {!ex = pt key="0 TO 100" }价格:[0到100]&facet.query = {!ex = pt *key="100 TO " }价格:[100至 *]

    原因是QueryFacet的处理方式与FieldFacet(facet.field vs facet.query)不同 . Solr只删除本地参数,即FieldFacet键中的{!ex ...} . 我实际上跟踪了它的代码,你可以在下面的链接中看到FacetComponent.java(v 4.6)中的第680行:

    http://svn.apache.org/viewvc/lucene/dev/tags/lucene_solr_4_6_0/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java?view=markup

    我没有进一步关注这个问题因为我的用例需要一个“漂亮”的密钥:)

  • 4

    这是我解决它的方式:

    for (int i = 0; i < facetQueries.size(); i++) {
        String value = facetQueries.get(i);
        query.addFacetQuery(String.format("{!ex=%s key=$fQValue_%s}%s", value, i, value));
        query.add(String.format("fQValue_%s", i), value);
    }
    

相关问题