gpt4 book ai didi

python - 嗖:不应该或只增加结果吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:41 24 4
gpt4 key购买 nike

我们使用 Haystack 1.2.7 和 Whoosh 2.4.1 作为后端对大约 9000 份文档进行了索引。尽管使用了 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 有关。之后我会深入研究。

最佳答案

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

因此看起来 * 比搜索词中的 / 绑定(bind)得更紧密。当然,我可以认为这是一个 whoosh 中的错误。 (我相信维护者会喜欢你的补丁☺)

想到的解决方法:

  1. 自己构建查询,而不是通过 Whoosh 的模糊定义和以人为本的查询语言进行往返查询。当然,这只有在您的索引在同一台机器上并且您正在使用相同的进程读取它时才有效;我对 Haystack 了解不多。

  2. 避免在 numero 字段中使用斜线。将它们更改为不太可能看起来像查询语法的内容,例如下划线。

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

关于python - 嗖:不应该或只增加结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15125416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com