2

現在、サイト検索に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は検索で利用できるので、次のように実行すると次のようになります。

market_local:Local

検索は正しく機能します(Lukeで)。ここでAnalyzerコードについて説明しますが、検索アプリケーションがLucene 2.1.0を使用し、最新バージョンのLukeが2.3.0を使用しているという事実まで、この問題を解決する方法はありますか?

4

4 に答える 4

6

Lucene のデバッグに最適なツールはLukeです。これを使用すると、インデックス自体を調べて、インデックスが作成されたものを確認したり、検索を実行したりできます。ダウンロードして、インデックスをポイントし、そこにあるものを確認することをお勧めします。

于 2008-09-03T22:17:54.020 に答える
2

「ヒットしないのはなぜですか?」のセクション。Lucene FAQ の には、役に立つと思われる提案がいくつかあります。Field.Index.UN_TOKENIZED を使用しているため、インデックス作成にアナライザーは使用されません (と思います)。検索時にアナライザーを使用している場合、それが問題の原因である可能性があります。適切なヒットを確実に取得するには、インデックス作成と検索のアナライザーを同じにする必要があります。

于 2008-09-04T11:36:45.847 に答える
1

もう 1 つの簡単な方法は、デバッガーまたはログ ステートメントを使用して、次の値を確認することです。

StringUtils.objectToString(currClip.get("market_local"))

それがあなたが思っていることであることを確認するために。

于 2008-09-04T11:44:48.027 に答える
1

Luke は Lucene にバンドルされていますが、Luke に別のバージョンの Lucene を使用するように指示できます。「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 では、「;」を「:」に置き換えます。)

ルークで確認できるように、

+( market_local:ローカル )

に書き換えられます

market_local:ローカル

Query オブジェクトの rewrite(IndexReader) メソッドが呼び出された場合。2 つのクエリは同等である必要があるため、2.1 にバグがある可能性があります。2.1 を使用する必要がある場合は、Query オブジェクトを IndexSearcher に渡す前に、そのメソッドを手動で呼び出すことができます。

于 2008-09-29T22:08:14.257 に答える