如何按不可用的值过滤搜索

时间:2013-06-11 12:55:19

标签: python django solr django-haystack

我有一个项目列表:

i = SearchQuerySet().models(Item)

现在,i中的每个项目都有一个属性price

我想缩小价格信息不可用的结果以及属于给定范围的价格信息

类似

i.narrow('price:( None OR [300 TO 400 ] )')

怎么办呢?

5 个答案:

答案 0 :(得分:7)

试试这个:

-(-price:[300 TO 400] AND price:[* TO *])

在逻辑上是相同的,它在Solr中有效。

答案 1 :(得分:5)

根据SolrQuerySyntax

纯正否定查询:

-field:[* TO *]查找没有字段值

的所有文档

您可以尝试:

q=(*:* -price:[* TO *]) OR price:[300 TO 400]

答案 2 :(得分:0)

目的是根据类型的提升按分数对某些项目进行排序,如果类型:自行车项目有图像,则加上。 结果应该是:

  1. 汽车
  2. 带图像的自行车
  3. 没有图像的自行车
  4. 这是我的第一个查询方法: type:"car"^10000 OR type:"boat"^5000 OR (type:"bike" AND image-type:[* TO *])^100 OR type:"bike"^5(工作正常)

    但是我忘记了没有类型字段的旧数据项。应该在结果集中如下:

    1. 汽车
    2. 带图像的自行车
    3. 没有图像的自行车
    4. 所有没有类型的项目
    5. 所以我将查询更改为-type:[* TO *] OR type:"car"^10000 OR type:"boat"^5000 OR (type:"bike" AND image-type:[* TO *])^100 OR type:"bike"^5,结果没有结果。

      所以我找到了这个帖子并尝试将我的查询更改为-(type:[* TO *] OR -type:"car"^10000 OR -type:"boat"^5000 OR -(type:"bike" AND image-type:[* TO *])^100 OR -type:"bike"^5),如此答案所示https://stackoverflow.com/a/17211744/326905

      但遗憾的是所有项目都有相同的分数:(

答案 3 :(得分:0)

Maurizio建议的双重否定查询可能会导致错误:

unexpected docvalues type NUMERIC for field 'price' (expected one of [SORTED, SORTED_SET]). Re-index with correct docvalues type.

(即使在重新编制索引之后。这可能与该字段的indexstore以及docvalues设置有关。)

您可以做的是免除您实际感兴趣的值的范围(之前和之后):

-(price:[* TO 300} price:{400 TO *])

请注意,在此否定查询中使用大括号排除值300和400,因此它们包含在搜索结果中。

答案 4 :(得分:-1)

如果您不关心文档分数并希望利用过滤器缓存,可以使用filter query,例如:

?q=*:*&fq=((-price:[* TO *]) or (price:[300 TO 400]))