1

我正在使用 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(*)查询。我知道有一些问题,但我无法弄清楚它是什么。

4

1 回答 1

2

我有同样的问题,发现默认StandardAnalyzer()使用minsize=2。因此,在您的架构中,您必须以其他方式告诉它。

schema = whoosh.fields.Schema(
  name = whoosh.fields.TEXT(stored=True, analyzer=whoosh.analysis.StandardAnalyzer(minsize=1)),
  # ...
)
于 2013-04-17T18:21:48.930 回答