如何通过不可用的值筛选搜索结果

12

我有一个项目列表如下:

i = SearchQuerySet().models(Item)

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

我希望能够缩小结果范围,其中包括价格信息不可用以及落在给定范围内的项目。

类似于:

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

怎么做到那个呢?


2
我想知道 这个语法 是否可行? - Martijn Pieters
@MartijnPieters,这个语法单独使用可以工作,但与OR一起使用就不行了。我已经更新了我的问题。 - user2404546
5个回答

13

试试这个:

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

逻辑上相同,在Solr中也可以运行。


为什么要使用 AND 而不是 OR,尽管它们对于 ANDOR 都有效,我想知道为什么。 - user2404546
我认为它不能使用OR。看一下这个链接:http://whatis.techtarget.com/definition/logic-gate-AND-OR-XOR-NOT-NAND-NOR-and-XNOR。 如果你暂时忘记括号内的负号,我们实际上在两个项之间进行NAND,这可能类似于OR,但并非在所有情况下都是如此,请小心。 - Maurizio In denmark

6
根据SolrQuerySyntax
纯负面查询: -field:[* TO *] 查找所有没有字段值的文档。
您可以尝试: q=(*:* -price:[* TO *]) OR price:[300 TO 400]

它仍然没有给我价格在300到400之间的物品。 - user2404546
价格的字段类型是什么?是sint还是string/text? - Jayendra
我不明白。我想要特定范围内价格下降的商品以及那些具有“None”值的商品,但我不知道如何查询。 - user2404546
更新答案与查询。这已经测试过并且运行良好。 - Jayendra
不太确定。你可以在狭窄的部分粘贴原文,但请删除“q=”这部分。 - Jayendra
显示剩余3条评论

0

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

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

即使重新索引,这可能与字段的indexstoredocvalues设置有关。

相反,您可以豁免您实际感兴趣的值的两个范围(之前和之后):

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

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

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://dev59.com/PWQn5IYBdhLWcg3wJ0i5#17211744

但是可悲的是,所有项目得分都相同 :(


-1

如果您不关心文档得分并想利用过滤器缓存,则可以使用筛选查询,例如:

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

Cojucaru,你能否以 models(Item).filter 的形式给出查询语句。我对solr非常陌生,无法将你的代码转换成那种形式。 - user2404546
尝试像这样使用 models(Item).filter_or(price=None, price__range=[300, 400]),参考 https://github.com/soby/django-haystack/commit/71c0b0bdf4e7a25421139901c910a978bb1c5386。对于空值,需要使用 None。 - Ion Cojocaru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接