2008-09-03 2 views
2

現在、Lucene 2.1.0をサイト検索に使用しており、難しい問題が発生しました。インデックスフィールドの1つがターゲット検索時に無視されています。ここではGoogleのインデックス内の文書にフィールドを追加するためのコードは次のとおりです。Java Luceneのトラブルシューティングフィールドを無視する

// 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初心者のようにこの問題のデバッグを開始する場所についての情報を得ようとしています。ルークインストール


UPDATE

私のようなものを実行ので、もし、最新のインデックスをチェックアウト... market_localフィールドは、検索で利用可能です:

market_local:Local 

検索正しく動作する(ルーク)。今私はAnalyzerのコードを調べていますが、私たちの検索アプリケーションがLucene 2.1.0を使用していて、Lukeの最新バージョンが2.3.0を使用しているという事実まで、この問題をチョークできる方法はありますか?

答えて

6

Luceneをデバッグするには、Lukeが最適です。これはインデックス自体を突き止めて何がインデックスに登録されているかを調べたり、検索などを行うことができます。インデックスをダウンロードし、そこには何がありますか?

+0

私の目は流血...ルークは醜いです! (しかしそれはトリックです。ありがとう+1) – DerMike

2

Lucene FAQのsection on "Why am I getting no hits?"には便利な候補がいくつかあります。 Field.Index.UN_TOKENIZEDを使用しているため、インデックス作成にアナライザは使用されません(私は思っています)。分析中にアナライザーを使用している場合は、それが問題の根源になっている可能性があります。索引付けと検索のアナライザーは、正しいヒットを得るために同じでなければなりません。行うには

1

別の簡単な事は作るために

StringUtils.objectToString(currClip.get( "market_local"))の値をチェックするために

をデバッガや、ロギングステートメントを使用することです確かにそれはあなたが思うものです。

1

ルークはルケンにバンドルされていますが、ルークに別のバージョンのルケンを使用するように指示できます。 "lucene-core-2.1.0.jar"には、使用したいLucene 2.1.0が含まれていて、 "luke.jar"にはLucene 2.3.0のLukeが含まれているとします。その後、次のコマンドでLukeを起動することができます。

のjava -classpathのLuceneコア-2.1.0.jar; org.getopt.luke.Luke

luke.jar(トリックは、クラスパスにルークの前のLuceneのバージョンを置くことですUnixでは、 ";"を ":"に置き換えてください。あなたはルークで確認することができたよう)

+(market_local:ローカル)

market_localに書き換えます:

the rewrite(IndexReader) method of the Query objectをもしローカルが呼び出されます。 2つのクエリは同等でなければならないので、2.1にバグがあるかもしれません。 2.1を使用する必要がある場合は、IndexSearcherにQueryオブジェクトを渡す前に手動でそのメソッドを呼び出そうとすることができます。

関連する問題