1

编辑

好的,我解决了。当我一次将一个术语添加到 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 索引中,正如您从仅搜索“表”的搜索结果中看到的那样

在此处输入图像描述

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

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

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();
}
4

2 回答 2

1

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

于 2014-01-20T10:18:17.513 回答
1
  • 检查您在索引和搜索时是否使用相同的分析器。
  • 检查您正在搜索的术语是否确实存在于索引中。(使用卢克)
于 2012-05-07T09:40:29.267 回答