Django Haystack AutoQuery:没有HAYSTACK_DEFAULT_OPERATOR ='AND'的结果

时间:2014-02-12 17:45:15

标签: elasticsearch django-haystack

(更新:问题特定于使用AutoQuery)

据我所知,从文档和查看源代码来看,HAYSTACK_DEFAULT_OPERATOR设置应该控制在查询集链接在一起时如何组合.filter(...)子句。

但是,当我另外使用AutoQuery时,它似乎正在控制所有单词是否匹配或短语中的任何单词匹配。 (我在ElasticSearch上)

例如:

HAYSTACK_DEFAULT_OPERATOR = 'OR'
sqs = SearchQuerySet().filter(content=AutoQuery('some of these words are in my content'))
sqs.count() = 53

HAYSTACK_DEFAULT_OPERATOR = 'AND'
sqs = SearchQuerySet().filter(content=AutoQuery('some of these words are in my content'))
sqs.count() = 0
sqs = SearchQuerySet().filter(content=AutoQuery('all these words are in the content'))
sqs.count() = 1

奇怪的是,使用filter_orfilter_and似乎没有任何区别。例如

HAYSTACK_DEFAULT_OPERATOR = 'AND'
sqs = SearchQuerySet().filter_or(content=AutoQuery('some of these words are in my content'))
sqs.count() = 0

答案必须在某处的干草堆源代码中,我会继续寻找,至少它似乎是文档中的缺陷......

这应该发生吗?有没有办法将默认情况下的过滤器链接到AND,同时仍然匹配AutoQuery中的任何单词?

2 个答案:

答案 0 :(得分:4)

不幸的是,没有。 AutoQuery的部分目的是通过单词拆分查询,并使每个单词成为单独的查询。它用来执行此操作的运算符取决于您的HAYSTACK_DEFAULT_OPERATOR设置,这是使用它的最重要原因之一(据我所知,HAYSTACK_DEFAULT_OPERATOR是影响用于AutoQuery的运算符的唯一方法)。

当你向它添加filter_or时,所发生的一切就是你的AND链包裹在OR中。当AND是默认运算符时,filter_or对于将多个过滤器查询链接在一起很有用,但在这种情况下,它不会执行您期望它执行的操作。

我有一个类似的问题,我最终击败它的方式是我自己有点实施。您可以使用解析器库(我登陆shlex,用于解析shell字符串的Python库,因为它将引号内的内容视为单个标记),然后使用它来构建您自己的自动查询。

sqs = SearchQuerySet()
sq = None
keywords = 'some of these words are in my content'
for phrase in shlex.split(keywords):
    if not sq:
        sq = SQ(content=phrase)
    else:
        sq |= SQ(content=phrase)
sqs = sqs.filter(sq)

使用| =(或运算符)修改SQ将使SQ对象链以OR作为运算符生成调用。您也可以使用& =用于链式AND。

此外,一旦您使用SQ对象进行过滤,您就可以随心所欲。如果默认运算符是AND,则在SQ对象上的过滤器之后链接的任何过滤器都将是AND过滤器。交替加倍,您可以使用filter_and指定特定过滤器应与查询进行AND运算。

答案 1 :(得分:-1)

简短的回答是 AutoQuery ,& 内置。

更新 Lucene boolean operators似乎有效,但不是全套。

Haystack Input Types包含 AutoQuery ,并在将文本发送到 ElasticSearch 之前清理文本。 AutoQuery 就像一个搜索表单输入框,,&amp ;;&strong; 运算符 ,加上引号。

由于ElasticSearch使用 Lucence AutoQuery 运算符大致是您对Google的期望。那么,"你好世界" -goodbye 应该为您提供具有完整字符串" hello world" 的文档,但不包含 goodbye