フィールドを無視する Java Lucene のトラブルシューティング
質問
現在、サイト検索に Lucene 2.1.0 を使用していますが、次のような難しい問題に遭遇しました。インデックス フィールドの 1 つが、対象を絞った検索中に無視されます。インデックス内のドキュメントにフィールドを追加するコードは次のとおりです。
// Add market_local to index
contactDocument.add(
new Field(
"market_local"
, StringUtils.objectToString(
currClip.get(
"market_local"
)
)
, Field.Store.YES
, Field.Index.UN_TOKENIZED
)
);
インデックスに対してクエリ ( * ) を実行すると、次の結果が返されます。
Result 1:
title: Foo Bar
market_local: Local
Result 2:
title: Bar Foo
market_local: National
ターゲットを絞ったクエリを実行します。
+( market_local:Local )
結果は見つかりません。
これが非常に具体的な質問であることは承知しています。私は Lucene の初心者なので、この問題のデバッグをどこから始めればよいかについての情報を入手しようとしているだけです。
アップデート
Luke をインストールし、最新のインデックスをチェックしています...フィールド マーケットローカル は検索で利用できるので、次のようなものを実行すると:
market_local:Local
検索は正しく機能します (Luke では)。今、Analyzer コードを調べているのですが、検索アプリケーションが Lucene 2.1.0 を使用しており、Luke の最新バージョンが 2.3.0 を使用しているという事実をこの問題に結びつける方法はありますか?
解決
Lucene のデバッグに最適なツールは次のとおりです。 ルーク, これにより、インデックス自体を調べて、何がインデックスに登録されているかを確認したり、検索を実行したりすることができます。ダウンロードしてインデックスを指定し、そこに何が含まれているかを確認することをお勧めします。
他のヒント
の 「ヒットが得られないのはなぜですか?」セクション Lucene FAQ には、役立つと思われるいくつかの提案が記載されています。Field.Index.UN_TOKENIZED を使用しているため、インデックス作成に Analyzer は使用されません (私はそう思います)。検索時にアナライザーを使用している場合は、それが問題の根本である可能性があります。適切なヒットを確実に取得するには、インデックス作成と検索のアナライザーが同じである必要があります。
もう 1 つの簡単な方法は、デバッガーまたはログ ステートメントを使用して、次の値を確認することです。
StringUtils.objectToString(currClip.get("market_local"))
それがあなたが思っているとおりであることを確認するためです。
Luke には Lucene がバンドルされていますが、別のバージョンの Lucene を使用するように Luke に指示できます。「lucene-core-2.1.0.jar」には使用したい Lucene 2.1.0 が含まれており、「luke.jar」には Lucene 2.3.0 を含む Luke が含まれているとします。次に、次のコマンドで Luke を起動できます。
java -classpath lucene-core-2.1.0.jar;luke.jar org.getopt.luke.Luke
(秘訣は、クラスパス上の Luke の前に自分のバージョンの Lucene を置くことです。また、これは Windows 上です。unixで、置き換えます ";"と ":"。)
Luke で確認できるように、
+( マーケットローカル:ローカル )
に書き換えられる
マーケットローカル:ローカル
もし Queryオブジェクトのrewrite(IndexReader)メソッド と呼ばれます。2 つのクエリは同等であるはずなので、2.1 にはバグがある可能性があります。2.1 を使用する必要がある場合は、Query オブジェクトを IndexSearcher に渡す前に、そのメソッドを手動で呼び出してみることができます。