我有一个项目列表:
i = SearchQuerySet().models(Item)
现在,i
中的每个项目都有一个属性price
我想缩小价格信息不可用的结果以及属于给定范围的价格信息
类似
i.narrow('price:( None OR [300 TO 400 ] )')
怎么办呢?
答案 0 :(得分:7)
试试这个:
-(-price:[300 TO 400] AND price:[* TO *])
在逻辑上是相同的,它在Solr中有效。
答案 1 :(得分:5)
纯正否定查询:
-field:[* TO *]
查找没有字段值
您可以尝试:
q=(*:* -price:[* TO *]) OR price:[300 TO 400]
答案 2 :(得分:0)
目的是根据类型的提升按分数对某些项目进行排序,如果类型:自行车项目有图像,则加上。 结果应该是:
这是我的第一个查询方法:
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
,结果没有结果。
所以我找到了这个帖子并尝试将我的查询更改为-(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.
(即使在重新编制索引之后。这可能与该字段的index
和store
以及docvalues
设置有关。)
您可以做的是免除您实际感兴趣的值的范围(之前和之后):
-(price:[* TO 300} price:{400 TO *])
请注意,在此否定查询中使用大括号排除值300和400,因此它们包含在搜索结果中。
答案 4 :(得分:-1)
如果您不关心文档分数并希望利用过滤器缓存,可以使用filter query
,例如:
?q=*:*&fq=((-price:[* TO *]) or (price:[300 TO 400]))