我正在使用飞快移动来索引超过200,000本书。但我遇到了一些问题。 whoosh查询解析器为诸如“C#”,“C ++”之类的单词返回NullQuery,其中包含元字符以及其他一些短字。这些单词用于某些文档的标题和正文中,所以我没有使用关键字类型。我想问题是在搜索或索引的分析或查询解析阶段,但我不能盲目地触摸我的数据。任何人都可以帮我纠正这个问题。 TNX。
我通过创建一个符合我要求的正则表达式模式的StandardAnalyzer解决了这个问题,这里是正则表达式模式:
'\ W + [#+ \ W] *'
这将使字段的标记化成功完成,并且搜索也很顺利。 但是当我使用像“some query ++ *”或“some ## *”这样的查询时,解析的查询将是单个Every查询,只是'*'。我也发现这与我的分析仪无关,这是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(*)
个查询。我知道有一些问题,但我无法弄清楚它是什么。
答案 0 :(得分:2)
我遇到了同样的问题,发现StandardAnalyzer()
默认使用minsize=2
。因此,在您的架构中,您必须另外告诉它。
schema = whoosh.fields.Schema(
name = whoosh.fields.TEXT(stored=True, analyzer=whoosh.analysis.StandardAnalyzer(minsize=1)),
# ...
)