0

我正在使用 lucene.net (2.3.2 ) 和兼容的 WordDelimiterFilter 的移植版本,但是当我使用带有连字符的单词执行通配符搜索时,它们不起作用。

一个例子是单词"CL-276-0001",当我搜索"cl" / "cl-276" / "cl-276-0001" 时,我发现记录没有问题(这是我最初试图解决的问题),但现在当我搜索"cl-276*""cl-276-0*"时,它不再起作用。“cl*”不受影响,这让我相信它可能正在使用查询解析器做一些事情,而不是将通配符添加回被调用的任何内容。

任何帮助解决/理解这一点将不胜感激。

编辑:我查看了查询解析器生成的查询。这正是输入的内容,我猜这意味着搜索不起作用,因为它会查找用户输入的内容作为前缀。现在我想我不应该改变这种行为。

第二次编辑:有人问分析仪是什么样的:

public override TokenStream TokenStream(string fieldName, TextReader reader)
{
    TokenStream result = new WhitespaceTokenizer(reader);
    result = new WordDelimiterFilter(result,1, 1, 1 , 1, 1 );
    result = new StandardFilter(result);
    result = new LowerCaseFilter(result);
    result = new StopFilter(result, LoadStopWords());
    return result;
}
4

1 回答 1

1

CL-276-0001被分析器分成标记 [cl] [276] 和 [0001],这些标记存储在索引中。
另一方面,通配符搜索不使用分析器,仅小写搜索条件。由于您的搜索标准cl-276(或cl-276-0)在索引中不存在,因此您不会得到任何结果。

一种解决方案是构建一个 TermQuery(大小写很重要),而不是使用 QueryParser。

于 2012-08-21T08:57:02.593 回答