0

検索結果に特殊な lucene 文字が含まれている lucene.net で全文検索を行う際に問題が発生しました。

Lucene ドキュメントに「content」という名前のフィールドがあります。このフィールドは次のように作成され、索引付けされたドキュメントのコンテンツが含まれます。

document.Add(new Field("content", fulltext, Field.Store.YES, Field.Index.ANALYZED));

インデックスの作成には、Standardanalyzer を使用しています。

インデックスのクエリには、次のコードを使用しています。

var queryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", analayzer);
queryParser.SetAllowLeadingWildcard(true);
queryParser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
Query fullTextQuery = queryParser.Parse(queryString);

クエリは、IndexSearcher から結果を取得するために使用される BooleanQuery に追加されます。コードはクエリの 99% で正常に機能するため、残りのコードはそれほど重要ではないと思います。また、インデックスのクエリに StandardAnalyzer を使用しています。

ここに問題があります。ドキュメントの「コンテンツ」フィールドに、「-」で区切られたテキストが含まれていることがあります。

一部のテキスト 一部のテキスト セレクターレバー 一部のテキスト 一部のテキスト

「セレクターレバー」を使用して全文検索(正確なフレーズ)を行っているとき。クエリは次のようになります。

内容:「セレクターレバー」

ここでの問題は、上記のテキストを含むドキュメントも見つかることですが、2 つの単語が空白ではなく「-」で区切られているため、見つからないはずです。

アナライザーと、「-」が lucene の特殊文字であるという事実に関係があると思います。

誰かがこの問題を解決するのを手伝ってくれるかもしれません。

前もって感謝します マーティン

4

1 に答える 1

0

問題は、インデックス時に使用しているアナライザーであると考えるのは正しいことです。

Lucene javadocsから:

JFlex で構築された文法ベースのトークナイザー

これは、ほとんどのヨーロッパ言語のドキュメントに適したトークナイザーです。

  • 句読点で単語を分割し、句読点を削除します。ただし、空白が続かないドットは、トークンの一部と見なされます。
  • トークンに数字が含まれていない限り、単語をハイフンで分割します。数字が含まれている場合、トークン全体が製品番号として解釈され、分割されません
  • 電子メール アドレスとインターネット ホスト名を 1 つのトークンとして認識します。

多くのアプリケーションには、特定のトークナイザーのニーズがあります。このトークナイザーがアプリケーションに合わない場合は、このソース コード ディレクトリをプロジェクトにコピーし、独自の文法ベースのトークナイザーを維持することを検討してください。

したがって、あなたの場合、WhitespaceAnalyzer空白でのみ分割する のようなより厳密なアナライザーでドキュメントをインデックス化する必要があります。

于 2011-08-19T20:54:16.570 に答える