【问题标题】:How to do a startsWith and then Contains Search using Lucene.NET 3.0?如何使用 Lucene.NET 3.0 执行startsWith 然后包含搜索?
【发布时间】:2013-06-09 14:15:32
【问题描述】:
在 Lucene.NET 3.0 中搜索和索引的最佳方法是什么,以便结果按以下方式排序:
- 以完整查询文本(作为单个单词)开头的结果,例如“酒吧极致”
- 以搜索词作为词片段开头的结果,例如“巴特·辛普森”
- 包含完整单词的查询文本的结果,例如“全国律师协会”
- 包含查询文本作为片段的结果,例如“联合调酒师公司”
示例:搜索 Bar
排序结果:
- 酒吧顶点
- 酒吧农历
- 巴特·辛普森
- 全国律师协会
- 国际调酒师协会
【问题讨论】:
标签:
lucene
lucene.net
contains
startswith
【解决方案1】:
Lucene 通常不支持根据字段中的位置进行搜索/评分。如果您为每个字段添加一些已知的字段开始分隔符或其他内容,则可以支持它。我真的不认为这是有道理的,从全文搜索的角度来看,文本字段中的位置不相关(即,如果我在文档中搜索 Bar,如果“Bart辛普森”在“全国律师协会”之前被退回)
除此之外,一个简单的前缀搜索可以处理其他所有事情。因此,如果您只是简单地添加您的单词开头标记,您可以使用比原来更高的前缀查询搜索修改后的词,然后您应该准确地得到您所描述的内容。
【解决方案2】:
可以用 linq 来实现。使用命中计数 Int32.MaxValue 进行 lucene 搜索。循环 ScoreDocs 的结果,并将其存储在集合 Searchresults 中。
示例代码:
Searchresults = (from scoreDoc in results.ScoreDocs select (new SearchResults { suggestion = searcher.Doc(scoreDoc.Doc).Get("suggestion") })).OrderBy(x => x.suggestion).ToList();
Searchresultsstartswith = Searchresults.Where(x => x.suggestion.ToLower().StartsWith(searchStringLinq.ToLower())).Take(10).ToList();
if (SearchresultsStartswith.Count > 0)
return SearchresultsStartswith.ToList();
else
return Searchresults.Take(10).ToList();