2014-01-07 42 views
7

背景

我试图将两个功能分开工作,但很难让它们一起工作。Solr - 方法查询中的{!}}

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

这并不是说名字= “{价格=前PT!}”

回答

4

我想这是因为:

  • *1示例使用facet.field它应该被命名为相同的方式,因为它采用现场(没有任何不包括信息)。
  • *2示例使用facet.query这应该代表query(与在查询中使用所有可能的信息......这是没有意义的,而不排除部分显示的查询,如部分)

不管怎么说如果有必要来命名它使用排除功能性的特定方面,那么可以通过以下方式进行(使用参数):

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

facet.query的相同workds ...例如如果你要隐藏的前一部分:

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

诗我已经使用了外部参数,因为这样 - 不需要手动转义特殊字符。

+0

工作+现在我明白它背后的原因,谢谢:) –

1

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

FQ = {价格标签= PT!}:![0至100] &面=真& facet.query = {EX = PT 键= “0〜100”}价格:![0至100] & facet.query = {EX = PT 键= “100 *”}价格:100 *]

这样做的原因是QueryFacet从区别对待FieldFacet(facet.field vs facet.query)。 Solr仅删除本地参数,即FieldFacet键中的{!ex ...}。其实,我跟踪下来的代码,这是你可以在线路680 FacetComponent.java看到(V 4.6)从下面的链接:

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

我没有进一步跟进,因为我的使用问题情况下,需要一个“漂亮”键反正:)

+0

谢谢!我选择了@rchukh的回答,因为它有更多的信息 –

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