呼:不应该或者只增加结果?

2024-09-27 22:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我们使用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在我的查尔菲尔德使用的分析工具有关。以后我会深入调查的。在


Tags: 文档modelssqallfilterexactwhooshstr
2条回答

您可以直接使用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')])

让我们重新格式化最后一行:

^{pr2}$

所以看起来*比搜索词中的/绑定得更紧密。当然,我可以把争论看作是一个小错误。(我相信维护者会喜欢你的补丁的☺) 在

想到的解决方法:

  1. 自己构建查询,而不是通过Whoosh的模糊定义和面向人的查询语言来回往返。当然,只有当你的索引在同一台机器上并且你用同样的过程来读取它时,这才有效;我对Haystack不太了解。

  2. 避免在numero字段中使用斜杠。将它们改为不太像查询语法的内容,比如下划线。

  3. 在进行前缀搜索时,请避免包含斜杠;例如,6210202443*在查询中的任何位置都可以正常工作。

按照@Eevee的想法,我做了一些测试。检查一下这个:

>>> QueryParser("content", schema=None).parse('((numero:6210202443/10 OR (numero:6210202443/10*))) AND (django_ct:logistica.pedidosaida)')
And([
    Or([
        Term('numero', '6210202443/10'), 
        And([
            Term('numero', '6210202443/'), 
            Prefix('content', '10')
        ])
    ]), 
    Term('django_ct', 'logistica.pedidosaida')
])

似乎/优先于OR。有道理吗?我认为逻辑运算符应该具有最高优先级。你同意吗?在

如果这个行为是正确的,我想这是一个错误在干草堆查询生成器。不是吗?在

我想提供一个补丁,但我不确定它是否真的是解析器中的一个bug。取决于更合理的优先顺序。在

相关问题 更多 >

    热门问题