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
。その後、そのクエリを追加の検索条件と組み合わせることができます。