【问题标题】:Lucene.NET Phrase search returning no resultsLucene.NET 短语搜索没有返回结果
【发布时间】:2014-01-20 18:18:17
【问题描述】:

编辑

好的,我解决了。当我将术语一次添加到 PhraseQuery 对象时,它保留了常用词。在这种情况下是“The”。

我所做的是使用 QueryParser 对象来解析查询(包括引号)。这会删除常用词,短语查询现在就像一个魅力。

List<string> searchList = Regex.Matches(searchTerms, @"(?<match>\w+)|\""(?<match>[\w\s]*)""")
                   .Cast<Match>()
                   .Select(m => m.Groups["match"].Value)
                   .ToList();

QueryParser parser = new QueryParser(LuceneFields.BODY, Analyzer);
BooleanQuery booleanQuery = new BooleanQuery();

// go through each term
foreach (string term in searchList)
{
  Query query = null;
  if (term.Contains(" ")) // multi word phrase
    query = parser.Parse("\"" + term + "\"");
  else
    query = parser.Parse(term);
  if (query.ToString() != "")
    booleanQuery.Add(query, BooleanClause.Occur.MUST);
}

我正在使用 Lucene.NET 创建一个简单的搜索,但在将短语搜索与布尔查询相结合时,我在使其正常工作时遇到了一些麻烦。

以下代码用于搜索:

List<string> searchList = Regex.Matches(searchTerms, @"(?<match>\w+)|\""(?<match>[\w\s]*)""")
                   .Cast<Match>()
                   .Select(m => m.Groups["match"].Value)
                   .ToList();

QueryParser parser = new QueryParser(LuceneFields.BODY, Analyzer);
BooleanQuery booleanQuery = new BooleanQuery();

// go through each term
foreach (string term in searchList)
{
  Query query = null;

  if (term.Contains(" ")) // multi word phrase
  {
    query = new PhraseQuery();
    foreach (string str in term.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
    {
      ((PhraseQuery)query).Add(new Term(LuceneFields.BODY, str));
    }
  }
  else
    query = parser.Parse(term);

  string strQuery = query.ToString();

  if (query.ToString() != "")
    booleanQuery.Add(query, BooleanClause.Occur.MUST);
}

我检查了正在创建的查询,对我来说看起来没问题:

+body:"The following table"

我还确认了这个文本实际上在 Lucene 索引中,正如您从搜索“table”的搜索结果中看到的那样

我真的不知道可能是什么问题。

我已使用以下代码创建索引:

Directory = FSDirectory.Open(new System.IO.DirectoryInfo(IndexDirectory));
Analyzer = new StandardAnalyzer(Version); 

using (IndexWriter indexWriter = new IndexWriter(Directory, Analyzer, new IndexWriter.MaxFieldLength(Int32.MaxValue)))
{
  Response.Write("Adding document...");
  Document document = new Document();

  // Store the IDDataContent
  document.Add(new Field(LuceneFields.ID, id.ToString(), Field.Store.YES, Field.Index.ANALYZED));

  // store the url to the file itself
  document.Add(new Field(LuceneFields.HREF, FileURL, Field.Store.YES, Field.Index.ANALYZED));

  //document.Add(new Field(LuceneFields.TITLE, Article.Title, Field.Store.YES, Field.Index.ANALYZED));

  // store the text of the PDF
  document.Add(new Field(LuceneFields.BODY, PdfContents, Field.Store.YES, Field.Index.ANALYZED));
  indexWriter.AddDocument(document);
  indexWriter.Optimize();
  indexWriter.Commit();
}

【问题讨论】:

  • 您是否尝试使用 Luke 运行短语查询?
  • 使用 Luke 的查询返回预期结果

标签: .net lucene


【解决方案1】:
  • 在索引和搜索时检查您是否使用相同的分析器。
  • 检查您要搜索的词是否确实存在于索引中。 (使用卢克)

【讨论】:

  • 我使用相同的分析器进行索引和搜索,搜索使用 Luke 产生预期的结果。
【解决方案2】:

尝试使用空白分析器,因为标准分析器在这种情况下不起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2011-05-02
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多