背景
我正在尝试将两个功能组合起来,这些功能可以单独运行,但却无法让它们协同工作 .
- 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
示例使用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]
所以最终的查询看起来像这样:
附:我已经使用外部参数作为键,因为这样 - 不需要手动转义特殊字符 .
我遇到了这个问题,我通过向{!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
我没有进一步关注这个问题因为我的用例需要一个“漂亮”的密钥:)
这是我解决它的方式: