嗖嗖不寻找像“C#”这样的短语

时间:2013-03-18 09:25:45

标签: whoosh

我正在使用飞快移动来索引超过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(*)个查询。我知道有一些问题,但我无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,发现StandardAnalyzer()默认使用minsize=2。因此,在您的架构中,您必须另外告诉它。

schema = whoosh.fields.Schema(
  name = whoosh.fields.TEXT(stored=True, analyzer=whoosh.analysis.StandardAnalyzer(minsize=1)),
  # ...
)