在 Lucene.NET 3.0 中搜索和索引的最佳方法是什么,以便结果按以下方式排序:
- 以完整查询文本(作为单个单词)开头的结果,例如“Bar Acme”
- 以搜索词作为单词片段开头的结果,例如“Bart Simpson”
- 包含查询文本作为完整单词的结果,例如“National Bar Association”
- 包含查询文本作为片段的结果,例如“United Bartenders Inc”
示例:搜索栏
排序结果:
- 酒吧顶点
- 酒吧农历
- 巴特辛普森
- 全国律师协会
- 国际调酒师协会
在 Lucene.NET 3.0 中搜索和索引的最佳方法是什么,以便结果按以下方式排序:
示例:搜索栏
排序结果:
Lucene 通常不支持根据字段中的位置进行搜索/评分。如果您为每个字段添加一些已知的字段开始分隔符或其他内容,则可以支持它。我真的不认为这是有道理的,从全文搜索的角度来看,文本字段中的位置不相关(即,如果我在文档中搜索 Bar,如果“Bart辛普森”在“全国律师协会”之前被退回)
除此之外,一个简单的前缀搜索可以处理其他所有事情。因此,如果您简单地添加您的单词开头标记,您可以搜索具有比原始更高前缀查询的修改后的术语,然后您应该准确地得到您所描述的内容。
可以用 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();