我正在使用 whoosh 索引超过 200,000 本书。但我遇到了一些问题。whoosh 查询解析器为“C#”、“C++”等带有元字符的词以及其他一些短词返回 NullQuery。这个词用在一些文件的标题和正文中,所以我没有为它们使用关键字类型。我想问题出在搜索或索引的分析或查询解析阶段,但我不能盲目地触摸我的数据。谁能帮我纠正这个问题。肿瘤坏死因子。
我通过创建一个符合我要求的正则表达式模式的 StandardAnalyzer 解决了这个问题,这里是正则表达式模式:
'\w+[#+.\w]*'
这将使字段的标记化成功完成,并且搜索也很顺利。但是当我使用诸如“some query++*”或“some##*”之类的查询时,解析的查询将是一个每个查询,只是“*”。我还发现这与我的分析器无关,这是 Whoosh 的默认行为。所以这是我的新问题:这种行为正确还是错误?
注意:从查询解析器中删除 WildcardPlugin 解决了这个问题,但我还需要 WildcardPlugin。
现在我正在使用以下代码:
from whoosh.util import rcompile
#for matching words like: '.NET', 'C++' and 'C#'
word_pattern = rcompile('(\.|[\w]+)(\.?\w+|#|\+\+)*')
#i don't need words shorter that two characters so i don't change the minsize default
analyzer = analysis.StandardAnalyzer(expression=word_pattern)
...现在在我的架构中:
...
title = fields.TEXT(analyzer=analyzer),
...
这将解决我的第一个问题,是的。但主要问题在于搜索。我不想让用户使用Every
查询或*
. 但是当我解析像我这样的查询时,C++*
我最终得到了一个Every(*)
查询。我知道有一些问题,但我无法弄清楚它是什么。