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

时间:2014-01-07 23:04:45

标签: solr lucene

背景

我正在尝试将两个功能组合在一起,但这些功能分别很好,但却无法让它们协同工作。

* 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} price”

3 个答案:

答案 0 :(得分:4)

我认为这是因为:

  • *1示例使用facet.field,其名称应与其使用的字段相同(不包含任何信息)。
  • *2示例使用facet.query代表query(包含查询中使用的所有可能信息...显示部分查询没有意义,例如没有排除部分)

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

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

facet.query的相同工作...例如,如果你想要隐藏前部:

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

其中queryOne是作为queryOne=price:[0 TO 100]

传递给solr的原始参数的一部分

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

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 *]

P.S。我使用了外部参数作为键,因为这样 - 不需要手动转义特殊字符。

答案 1 :(得分:1)

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

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

原因是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

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

答案 2 :(得分:1)

以下是我如何解决它:

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);
}