如何使用Lucene.NET 3.0进行StartWith和Contains搜索?

如何使用Lucene.NET 3.0进行StartWith和Contains搜索?,lucene,lucene.net,contains,startswith,Lucene,Lucene.net,Contains,Startswith,在Lucene.NET 3.0中搜索和索引的最佳方式是什么,以使结果按以下方式排序: 以完整查询文本(作为单个单词)开头的结果,例如“Bar Acme” 以搜索词开头的结果,例如“Bart Simpson” 以全字形式包含查询文本的结果,例如“全国律师协会” 以片段形式包含查询文本的结果,例如“联合调酒师公司” 示例:搜索酒吧 有序结果: 棒顶点 月球酒吧 巴特·辛普森 全国律师协会 国际调酒师协会 Lucene通常不支持基于字段中的位置进行搜索/评分。如果您在每个字段前面加上一些已知的fiel

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

  • 以完整查询文本(作为单个单词)开头的结果,例如“Bar Acme”
  • 以搜索词开头的结果,例如“Bart Simpson”
  • 以全字形式包含查询文本的结果,例如“全国律师协会”
  • 以片段形式包含查询文本的结果,例如“联合调酒师公司”
  • 示例:搜索酒吧

    有序结果:

  • 棒顶点
  • 月球酒吧
  • 巴特·辛普森
  • 全国律师协会
  • 国际调酒师协会

  • Lucene通常不支持基于字段中的位置进行搜索/评分。如果您在每个字段前面加上一些已知的fieldstart分隔符或其他东西,就有可能支持它。我真的不认为这是有意义的,在全文搜索中,文本字段中的位置是不相关的(即,如果我在文档中搜索酒吧,如果“Bart Simpson”在“全国律师协会”之前返回,我可能会很恼火)


    除此之外,一个简单的前缀搜索可以处理所有其他事情。因此,如果您只需添加单词开头标记,您就可以使用比原始词更高的boost前缀查询来搜索修改后的词,然后您就应该拥有您所描述的内容。

    这可以通过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();