Whoosh 呼呼不响';不要搜索像“的”这样的短词;“C”;

Whoosh 呼呼不响';不要搜索像“的”这样的短词;“C”;,whoosh,Whoosh,我正在使用whoosh索引超过200000本书。但是我遇到了一些问题。 whoosh查询解析器为“C#”、“C++”等包含元字符的单词以及其他一些短单词返回null查询。这些词用于某些文档的标题和正文中,因此我不使用关键字类型。我猜问题是在搜索或索引的分析或查询解析阶段,但我不能盲目地触摸我的数据。有人能帮我纠正这个问题吗。Tnx 我通过使用符合我要求的正则表达式模式创建StandardAnalyzer解决了这个问题,以下是正则表达式模式: “\w++.\w]*” 这将使字段的标记化能够成功完成

我正在使用whoosh索引超过200000本书。但是我遇到了一些问题。 whoosh查询解析器为“C#”、“C++”等包含元字符的单词以及其他一些短单词返回null查询。这些词用于某些文档的标题和正文中,因此我不使用关键字类型。我猜问题是在搜索或索引的分析或查询解析阶段,但我不能盲目地触摸我的数据。有人能帮我纠正这个问题吗。Tnx

我通过使用符合我要求的正则表达式模式创建StandardAnalyzer解决了这个问题,以下是正则表达式模式:

“\w++.\w]*”

这将使字段的标记化能够成功完成,搜索也会顺利进行。 但是当我使用诸如“some query++*”或“some###*”之类的查询时,解析后的查询将是一个单独的查询,而不是一个“*”。我还发现这与我的分析器无关,这是呼呼的默认行为。所以这里是我的新问题:这个行为是正确的还是一个bug

注意:从查询解析器中删除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),
...

这将解决我的第一个问题,是的。但主要问题在于搜索。我不想让用户使用
每个
查询或
*
进行搜索。但是当我解析像
C++*
这样的查询时,我最终得到一个
Every(*)
查询。我知道有一些问题,但我不知道是什么问题。

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

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

谢谢你的回答,奇奇。是的,通过更改
StandardAnalizer
的minsize和expression参数,我们可以更改可接受的索引标记。但是我改变了我的问题。嗯。。。现在,人们如何才能找到原始问题的解决方案呢?如果你打开一个新问题而不是完全改变这个问题,那会更好。