1

編集

わかりました、私はそれを解決しました。PhraseQueryオブジェクトに一度に1つずつ用語を追加していたとき、それは一般的な単語を保持していました。「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
  • インデックス作成と検索中に同じアナライザーを使用しているかどうかを確認します。
  • 検索している用語が実際にインデックスに存在するかどうかを確認します。(ルーク使用)
于 2012-05-07T09:40:29.267 に答える
1

このような場合、標準アナライザーは機能しませんので、whitespaceanalyzer を使用してみてください

于 2014-01-20T10:18:17.513 に答える