我正在使用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;
}
答案 0 :(得分:1)
CL-276-0001
分割为标记[cl] [276]和[0001],这些标记存储在索引中。
在另一个和通配符搜索中,不要仅使用分析器小写搜索标准。由于您的搜索标准cl-276
(或cl-276-0
)在索引中不存在,因此您无法获得任何结果。
对此的一个解决方案是构建TermQuery(外壳很重要)而不是使用QueryParser。