1

Lucene.netインデックスがあり、フィールドの1つが括弧を含む多くのエントリを受け取ります。そのフィールドを検索する前に、検索語を。に通しQueryParser.Escape(searchTerm)ます。括弧を含むエントリを検索しても見つかりません。しかし、Visual Studioデバッガーを実行しているときに、検索文字列へのエスケープを元に戻したところ、検索でエントリが正常に見つかりました。

データのインデックスを作成するときは、標準アナライザーを使用しています。このフィールドについては、保存していますが、分析はしていません。

フィールドのインデックス作成:

doc.Add(new Field("fieldName", fieldValue, Field.Store.YES, Field.Index.NOT_ANALYZED));

試行錯誤よりも、TermまたはTermQueryオブジェクトを作成するときに特殊文字をエスケープする必要があるかどうか(またはどの特殊文字をエスケープする必要があるか)を知るためのより良い方法はありますか?

編集

フィールドでの検索:

これは機能します:

List<Query> queryParts = new List<Query>;
queryParts.Add(new TermQuery(new Term("fieldName", searchValue)));

私が最初に試したが、うまくいかなかったこと:

List<Query> queryParts = new List<Query>;
queryParts.Add(new TermQuery(new Term("fieldName", QueryParser.Escape(searchValue))));

searchValueユーザー入力から来ています。インデックス付きの値と検索値の両方に、Luceneにとって特別な意味を持つ括弧とその他の可能性のある文字が含まれていることが期待されます。

queryParts複数の検索条件を収集し、最終的には1つに結合されBooleanQueryます。ユーザーの選択に応じて、すべての要素をまたはのいずれかと組み合わせることができBooleanClause.Occur.MUSTますBooleanClause.Occur.SHOULD。その後、そのクエリを追加の検索条件と組み合わせることができます。

4

1 に答える 1

2

入力を使用してQueryParser.Parse(string)を呼び出さない場合は、QueryParser.Escape()を使用する必要はありません。

Escapeメソッドは入力にエスケープ文字を追加しますが、用語を手動で作成するため、エスケープ文字はそこにとどまり、luceneがそれらを検索しようとします。

インデックス付きの値と検索値の両方に、Luceneにとって特別な意味を持つ括弧とその他の可能性のある文字が含まれていることが期待されます

これらの文字は、QueryParser Parseメソッドにとって特別な意味を持ち、他の場所では特別な意味を持ちません。

于 2012-04-18T13:44:33.203 に答える