【问题标题】: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 中搜索和索引的最佳方法是什么,以便结果按以下方式排序:

  1. 以完整查询文本(作为单个单词)开头的结果,例如“酒吧极致”
  2. 以搜索词作为词片段开头的结果,例如“巴特·辛普森”
  3. 包含完整单词的查询文本的结果,例如“全国律师协会”
  4. 包含查询文本作为片段的结果,例如“联合调酒师公司”

示例:搜索 Bar

排序结果:

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

【问题讨论】:

    标签: 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 2011-08-20
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多