假设我在搜索索引中有一条包含此字符串“hairdresser doing great work”的记录。
如何使搜索查询“奥克兰的理发师”仍然在搜索结果中返回上述记录?
我试过这个,但我觉得这不是正确的方法:
for word in query.split(' '):
result = SearchQuerySet().filter_or(content=word)
而且我不想使用 SOLR 我觉得安装 SOLR 只是为了解决这种不会一直发生的搜索。
假设我在搜索索引中有一条包含此字符串“hairdresser doing great work”的记录。
如何使搜索查询“奥克兰的理发师”仍然在搜索结果中返回上述记录?
我试过这个,但我觉得这不是正确的方法:
for word in query.split(' '):
result = SearchQuerySet().filter_or(content=word)
而且我不想使用 SOLR 我觉得安装 SOLR 只是为了解决这种不会一直发生的搜索。
另一种更 DRY 的方法是指定您自己的输入类型来处理将字符串转换为一系列或过滤器。Raw
您还可以使用输入类型传递特定于 Whoosh 的查询。
如果你只需要在几个地方使用它,我会坚持你现在的方式。否则我会为它指定一个输入类型。
编辑:Whoosh 的默认解析器使用简单的布尔运算符。正如您在文档中看到的那样,默认运算符是AND
. 要获得 Whoosh 的正确查询,只需执行以下操作:
query = ' OR '.join(query.split(' '))
result = SearchQuerySet().filter(content=Raw(Clean(query)))
Clean
自动转义输入以防止恶意代码注入。
我设法通过使用来实现(某种程度上)这一点auto_query()
whoosh 或 xapian 都能够搜索查询中单词的顺序丢弃,但如果搜索查询包含索引中不存在的单词,则不会匹配任何内容。