我有一个项目列表如下:
i = SearchQuerySet().models(Item)
现在,i
中的每个项目都有一个名为 price
的属性。
我希望能够缩小结果范围,其中包括价格信息不可用以及落在给定范围内的项目。
类似于:
i.narrow('price:( None OR [300 TO 400 ] )')
怎么做到那个呢?
我有一个项目列表如下:
i = SearchQuerySet().models(Item)
现在,i
中的每个项目都有一个名为 price
的属性。
我希望能够缩小结果范围,其中包括价格信息不可用以及落在给定范围内的项目。
类似于:
i.narrow('price:( None OR [300 TO 400 ] )')
怎么做到那个呢?
试试这个:
-(-price:[300 TO 400] AND price:[* TO *])
逻辑上相同,在Solr中也可以运行。
AND
而不是 OR
,尽管它们对于 AND
和 OR
都有效,我想知道为什么。 - user2404546-field:[* TO *]
查找所有没有字段值的文档。q=(*:* -price:[* TO *]) OR price:[300 TO 400]
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 *])
目标是根据类型和是否有图片对一些项目进行评分排序。
这是我的第一个查询方法:
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://dev59.com/PWQn5IYBdhLWcg3wJ0i5#17211744
但是可悲的是,所有项目得分都相同 :(
如果您不关心文档得分并想利用过滤器缓存,则可以使用筛选查询
,例如:
?q=*:*&fq=((-price:[* TO *]) or (price:[300 TO 400]))
models(Item).filter
的形式给出查询语句。我对solr非常陌生,无法将你的代码转换成那种形式。 - user2404546