2

我搜索一下。我按字段 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')

当你需要他的时候,丹尼尔林赛在哪里?

4

1 回答 1

2

YMMV——文档(http://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#narrow)指出这种方法不能在后端之间移植,并且语法取决于后端。该部分中的示例甚至有一个看起来像“SearchQuerySet().narrow('title:smoothie')”的 lucene 示例。

在源代码中,它看起来像 haystack 非常信任地将您拥有的任何内容作为您的狭窄参数传递到后端。你没有说你正在使用什么后端,但也许这样的事情会让你在 solr 中得到你想要的 fq:

    sqs = sqs.narrow('fieldA:burlap OR fieldB:sack')

Filter_or 是一种与窄不同的动物,至少在 solr 中是这样。filter_or 会将该子句添加到主查询中,从而产生不同的结果集、不同的评分等。Narrow 将创建一个过滤查询。相反,它用于过滤您的原始结果(令人震惊,对吗?)并且它可以被缓存,如果您要经常使用该过滤器,这可以提高性能。

哦,我输入了所有这些东西,但仍然不知道 Dan​​iel Lindsay 在哪里。

于 2014-11-04T22:39:28.687 回答