多选Solr滤波和分面

时间:2016-10-01 03:39:09

标签: solr filter facet faceted-search

我试图为我的Solr服务实施方面,但我对我所看到的内容感到有些困惑。我理解标签和排除用于忽略特定的过滤器计数,这样就会发生这样的事情:

[] Nike 55
[] Adidas 54
[] New Balance 32

[] Black 25
[] Blue 26
[] Red 29
[] Yellow 23
---------------

[X] Nike 55
[] Adidas 54
[] New Balance 32

[] Black 20
[] Blue 15
[] Red 13
[] Yellow 13


[X] Nike 20
[] Adidas 0
[] New Balance 0

[X] Black 20
[] Blue 15
[] Red 13
[] Yellow 13

据我所知,在上述情况下,我们会针对Solr查询过滤品牌,并在品牌过滤器/方面传递标签/排除项,以便计数仅在品牌上保持不变。然后,我们按颜色进行过滤,并保持THOSE计数相同,同时让其他计数(品牌)改变。

然而,这是我被卡住的地方。在较大的网站上(如Newegg,亚马逊等......)我注意到情况并非如此。当我通过我的第一个过滤器选择时,我选择的过滤器计数不会更改,而其他计数则会更改。

[X] Nike 51
[] Adidas 54
[] New Balance 32

[] Black 20
[] Blue 15
[] Red 13
[] Yellow 13

然后,当我通过第二个过滤器(与第一个过滤器不同)进行选择时,第二个过滤器计数不会改变,但是第一个过滤器计数会以不会使计数归零的方式进行计数,像这样:

[X] Nike 8
[] Adidas 12
[] New Balance 5

[X] Black 20
[] Blue 15
[] Red 13
[] Yellow 13

这里发生了什么?我觉得我发送的方面和过滤器错误地解决了问题。我只为最近选择的过滤器发送标签和排除。这总是会根据最近的选择更改其他计数。但在我概述的最后一个案例中,即使我只搜索Black Nike鞋子,品牌过滤器并没有归零。我仍然得到阿迪达斯和新平衡的预期数量。对不起,这篇文章太长了,但我没想到一个很好的方法来解释它没有例子。

1 个答案:

答案 0 :(得分:3)

您的案例中的问题是,您过滤结果时 第二次忘记标记品牌过滤查询
让我们举个例子来解决你的问题。请参考我使用

的查询
<lst name="brand">
<int name="Nike">6</int>
<int name="Adidas">3</int>
<int name="New Balance">1</int>
</lst>
<lst name="color">
<int name="Black">5</int>
<int name="Blue">5</int>
</lst>

用户选择&#34; Nike&#34;

首先你选择&#34; Nike&#34;来自Brand facet。我们添加了标有品牌的过滤条件,以排除结果并重新发出请求

facet=true
&facet.field={!ex=brand}brand
&fq={!tag=brand}brand:Nike

我们得到的回应

<lst name="facet_fields">
<lst name="brand">
<int name="Nike">6</int>
<int name="Adidas">3</int>
<int name="New Balance">1</int>
</lst>
<lst name="color">
<int name="Black">3</int>
<int name="Blue">3</int>
</lst>

用户选择&#34;黑&#34;

现在用户选择&#34; Black&#34;从颜色方面。我们添加了另一个标记为颜色的新过滤器查询,以将其从结果中排除。

facet=true
&facet.field={!ex=brand}brand
&facet.field={!ex=color}color
&fq={!tag=brand}brand:Nike
&fq={!tag=color}color:Black

我们得到的回应

<lst name="brand">
<int name="Nike">3</int>
<int name="Adidas">2</int>
<int name="New Balance">0</int>
</lst>
<lst name="color">
<int name="Black">3</int>
<int name="Blue">3</int>
</lst>