我进行了搜索。我按字段 A 缩小范围。我按字段 B 缩小范围。我得到的结果包括粗麻布和麻袋。我想要的是获得包含粗麻布或麻袋的结果。
sqs = sqs.narrow(fieldA='burlap')
sqs = sqs.narrow(fieldB='sack')
您可以通过以下方式进行一定程度的 OR 缩小:
sqs = sqs.narrow(fieldA=('burlap' or 'tweed' or 'plastic'))
sqs = sqs.narrow(fieldB='sack')
但是你最终仍然会得到粗麻布和麻袋的结果。此方法的替代方法如下,但它并不理想,因为它在大数据集上似乎很慢:
sqs = sqs.filter_or(fieldA='burlap')
sqs = sqs.filter_or(fieldB='sack')
当您需要丹尼尔·林赛时他在哪里?
最佳答案
YMMV - 文档 ( http://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#narrow ) 指出此方法不可在后端之间移植,并且语法取决于后端。该部分中的示例甚至有一个 lucene 看起来“SearchQuerySet().narrow('title:smoothie')”的示例。
在源代码中,看起来 haystack 非常信任地将您所拥有的任何内容作为您的狭义参数传递给后端。你没有说你正在使用什么后端,但也许这样的东西会让你在 solr 中得到你想要的 fq:
sqs = sqs.narrow('fieldA:burlap OR fieldB:sack')
Filter_or 与narrow 不同,至少在solr 中是这样。 Filter_or 会将该子句添加到主查询中,从而产生一组不同的结果、不同的评分等。Narrow 将创建一个过滤查询。相反,它用于过滤您的原始结果(令人震惊,对吧?)并且它可以被缓存,如果您要经常使用该过滤器,这可以帮助提高性能。
哦,我输入了所有这些内容,但仍然不知道 Daniel Lindsay 在哪里。
关于filter - Django haystack 缩小,字段之间使用 OR 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23544825/