Lucene中的通配符和WordDelimiterFilter

时间:2012-08-21 08:39:05

标签: c# solr lucene lucene.net

我正在使用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;
}

1 个答案:

答案 0 :(得分:1)

分析器将

CL-276-0001分割为标记[cl] [276]和[0001],这些标记存储在索引中。
在另一个和通配符搜索中,不要仅使用分析器小写搜索标准。由于您的搜索标准cl-276(或cl-276-0)在索引中不存在,因此您无法获得任何结果。

对此的一个解决方案是构建TermQuery(外壳很重要)而不是使用QueryParser。