我们使用Haystack 1.2.7和Whoosh 2.4.1作为后端,索引了大约9k个文档。尽管使用了干草堆,但它看起来像是一个嗖嗖的问题。看看我的调试案例:
1)如果我只是运行精确查找,Whoosh会找到我的文档(如下所示):
>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__exact='6210202443/10')
[<SearchResult: logistica.pedidosaida (pk=u'6')>]
2)如果我只运行startswith lookup,Whoosh找不到我的文档(如下所示):
^{pr2}$3)如果我将所有内容放在一个或一个查询中,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用第一个查询找到我的文档是很奇怪的(编号:6210202443/10)但第二个就不行了(编号:6210202443/10*)一个。但我想这和Haystack在我的查尔菲尔德使用的分析工具有关。以后我会深入调查的。在
您可以直接使用
QueryParser
来查看Whoosh是如何解析该查询的:让我们重新格式化最后一行:
^{pr2}$所以看起来
*
比搜索词中的/
绑定得更紧密。当然,我可以把争论看作是一个小错误。(我相信维护者会喜欢你的补丁的☺) 在想到的解决方法:
自己构建查询,而不是通过Whoosh的模糊定义和面向人的查询语言来回往返。当然,只有当你的索引在同一台机器上并且你用同样的过程来读取它时,这才有效;我对Haystack不太了解。
避免在
numero
字段中使用斜杠。将它们改为不太像查询语法的内容,比如下划线。在进行前缀搜索时,请避免包含斜杠;例如,
6210202443*
在查询中的任何位置都可以正常工作。按照@Eevee的想法,我做了一些测试。检查一下这个:
似乎
/
优先于OR
。有道理吗?我认为逻辑运算符应该具有最高优先级。你同意吗?在如果这个行为是正确的,我想这是一个错误在干草堆查询生成器。不是吗?在
我想提供一个补丁,但我不确定它是否真的是解析器中的一个bug。取决于更合理的优先顺序。在
相关问题 更多 >
编程相关推荐