我正在尝试将两个功能组合在一起,但这些功能分别很好,但却无法让它们协同工作。
* 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”
答案 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]
所以最终的查询看起来像这样:
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行:
我没有进一步关注这个问题,因为我的用例无论如何都需要一个“漂亮”的密钥:)
答案 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);
}