2

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

  1. 以完整查询文本(作为单个单词)开头的结果,例如“Bar Acme”
  2. 以搜索词作为单词片段开头的结果,例如“Bart Simpson”
  3. 包含查询文本作为完整单词的结果,例如“National Bar Association”
  4. 包含查询文本作为片段的结果,例如“United Bartenders Inc”

示例:搜索

排序结果:

  1. 酒吧顶点
  2. 酒吧农历
  3. 巴特辛普森
  4. 全国律师协会
  5. 国际调酒师协会
4

2 回答 2

1

Lucene 通常不支持根据字段中的位置进行搜索/评分。如果您为每个字段添加一些已知的字段开始分隔符或其他内容,则可以支持它。我真的不认为这是有道理的,从全文搜索的角度来看,文本字段中的位置不相关(即,如果我在文档中搜索 Bar,如果“Bart辛普森”在“全国律师协会”之前被退回)

除此之外,一个简单的前缀搜索可以处理其他所有事情。因此,如果您简单地添加您的单词开头标记,您可以搜索具有比原始更高前缀查询的修改后的术语,然后您应该准确地得到您所描述的内容。

于 2013-06-10T16:23:17.073 回答
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();
于 2016-07-29T06:43:55.163 回答