我们使用 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) 如果我只是运行startswith 查找,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 有关。之后我会深入研究一下。