如何使用Lucene.NET 3.0进行startsWith然后包含搜索?

问题描述 投票:2回答:2

在Lucene.NET 3.0中搜索和索引的最佳方法是什么,以便按以下方式排序结果:

  1. 以完整查询文本(作为单个单词)开头的结果,例如“酒吧Acme”
  2. 以搜索词开头的结果作为单词片段,例如“巴特辛普森”
  3. 将查询文本包含为完整单词的结果,例如“国家律师协会”
  4. 将查询文本包含为片段的结果,例如“United Bartenders Inc”

示例:搜索栏

订购结果:

  1. Bar Acme
  2. Bar Lunar
  3. 巴特辛普森
  4. 国家律师协会
  5. 国际调酒师协会
lucene lucene.net contains startswith
2个回答
1
投票

Lucene一般不支持基于字段内的位置进行搜索/评分。如果您使用某些已知的fieldstart分隔符或其他内容为每个字段添加前缀,则可以支持它。我不认为这是有道理的,在全文搜索的镜头中,文本字段中的位置不相关(即,如果我在文档中搜索Bar,如果“Bart,我可能会相当恼火”辛普森“在国家律师协会之前被退回”)

除此之外,简单的前缀搜索处理其他一切。因此,如果您只是添加单词标记的开头,则可以使用比原始标记更高的加速前缀查询来搜索修改后的术语,然后您应该准确地描述您所描述的内容。


1
投票

它可以通过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();
© www.soinside.com 2019 - 2024. All rights reserved.