我们使用Haystack 1.2.7和Whoosh 2.4.1作为后端索引了大约9k个文档。尽管使用了Haystack,它看起来还是一个Whoosh问题。看一下我的调试案例:
1)如果我只运行精确查找,Whoosh会找到我的文档(如下所示):
>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__exact='6210202443/10')
[<SearchResult: logistica.pedidosaida (pk=u'6')>]
2)如果我只是运行startwith查找,Whoosh找不到我的文档(如下所示):
>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__startswith='6210202443/10')
[]
3)如果我将所有内容放到一个OR查询中,Whoosh仍然找不到我的文档(如下所示):
>>> SearchQuerySet().all().models(PedidoSaida).filter(SQ(numero__exact='6210202443/10') | SQ(numero__startswith='6210202443/10'))
[]
查看Haystack发送给Whoosh的查询,我们有:
>>> str(SearchQuerySet().all().models(PedidoSaida).filter(numero__exact='6210202443/10').query)
'(numero:6210202443/10) AND (django_ct:logistica.pedidosaida)'
>>> str(SearchQuerySet().all().models(PedidoSaida).filter(numero__startswith='6210202443/10').query)
'(numero:6210202443/10*) AND (django_ct:logistica.pedidosaida)'
>>> str(SearchQuerySet().all().models(PedidoSaida).filter(SQ(numero__exact='6210202443/10') | SQ(numero__startswith='6210202443/10')).query)
'((numero:6210202443/10 OR numero:6210202443/10*)) AND (django_ct:logistica.pedidosaida)'
如您所见,最后一个查询正好是(第一个或第二个)。 Whoosh找不到我的文件吗?我看不出我的逻辑错在哪里:我使用的是OR,查找的内容少于使用其中一种语句的情况。
我还认为,Whoosh通过第一个查询(numero:6210202443/10)而不是第二个查询(numero:6210202443/10 *)找到我的文档是很奇怪的。但是我想这与Haystack在我的CharField中使用的StemmingAnalyzer有关。之后,我将对此进行深入研究。
最佳答案
您可以直接使用QueryParser
来查看Whoosh如何解析该查询:
>>> from whoosh.qparser import QueryParser
>>> QueryParser("content", schema=None).parse('((numero:6210202443/10 OR numero:6210202443/10*)) AND (django_ct:logistica.pedidosaida)')
And([Or([Term('numero', '6210202443/10'), Term('numero', '6210202443/')]), Prefix('content', '10'), Term('django_ct', 'logistica.pedidosaida')])
让我们重新格式化最后一行:
And([
Or([
Term('numero', '6210202443/10'),
Term('numero', '6210202443/'),
]),
Prefix('content', '10'),
Term('django_ct', 'logistica.pedidosaida'),
])
因此,看起来
*
与搜索词中的/
绑定更紧密。我肯定会认为这是飞快移动中的错误。 (我确信维护人员会喜欢您的补丁☺)解决方法:
自己构建查询,而不是通过Whoosh的模糊定义和以人为本的查询语言来回查询。当然,只有当索引位于同一台计算机上并且您使用相同的进程来读取它时,这种方法才有效。我对干草堆了解不多。
避免在
numero
字段中使用斜杠。将它们更改为不太可能看起来像查询语法的内容,例如下划线。进行前缀搜索时,请避免包含斜杠;例如,
6210202443*
在查询中的任何地方都可以正常工作。关于python - 糟糕:不应该还是只能增加结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15125416/