Django haystack在字段之间用OR运算符缩小

时间:2014-05-08 14:32:13

标签: filter django-haystack narrowing

我做了一个搜索。我缩小了字段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')

Daniel Lindsay何时需要他?

1 个答案:

答案 0 :(得分:1)

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

在源代码中,看起来干草堆非常可靠地将你所拥有的任何东西作为你的狭隘论点传递到后端。你没有说出你正在使用的后端,但也许这样的东西会让你在solr中得到你想要的fq:

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

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

D'哦,我输入了所有这些东西,但仍然不知道Daniel Lindsay在哪里。