2008-09-03 30 views
2

我們目前正在使用Lucene 2.1.0進行我們的網站搜索,並且遇到了一個難題:我們的一個索引字段在有針對性的搜索過程中被忽略。下面是我們的索引中添加字段添加到文檔中的代碼: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 

搜索工作正常(在盧克)。我現在正在查看我們的分析器代碼,有什麼辦法可以將這個問題記錄下來,因爲我們的搜索應用程序使用的是Lucene 2.1.0,最新版本的Luke使用的是2.3.0?

回答

6

爲了調試Lucene,最好使用的工具是Luke,它可以讓你在索引中查找索引,執行搜索等。我建議下載它,指向它的索引,然後看那裏有什麼。

+0

我的眼睛流血......盧克很醜! (但它的竅門,謝謝+1) – DerMike 2012-04-11 16:48:23

2

在Lucene FAQ中的section on "Why am I getting no hits?"有一些建議,你可能會覺得有用。你正在使用Field.Index.UN_TOKENIZED,所以沒有分析器將用於索引(我認爲)。如果您在搜索時使用分析儀,那麼這可能是您的問題的根源 - 索引和搜索分析儀應該是相同的,以確保您獲得正確的點擊率。

1

另一個簡單的事情將是使用調試器或日誌記錄語句來檢查

StringUtils.objectToString的值(currClip.get( 「market_local」))

使當然,這是你的想法。

1

Luke與Lucene捆綁在一起,但你可以告訴Luke使用另一個版本的Lucene。說「lucene-core-2.1.0.jar」包含您要使用的Lucene 2.1.0,「luke.jar」包含Luke和Lucene 2.3.0。然後你可以用下面的命令啓動Luke。

的java -classpath Lucene的核心-2.1.0.jar; luke.jar org.getopt.luke.Luke

(訣竅是把你的Lucene的版本盧克之前在classpath 。此外,這是在Windows上。在Unix上,將「;」替換爲「:」。)

如您在盧克檢查,

+(market_local:本地)

被改寫爲

market_local:本地

如果the rewrite(IndexReader) method of the Query object叫做。這兩個查詢應該是等效的,因此可能會有2.1中的錯誤。如果您必須使用2.1,則可以在將Query對象傳遞給IndexSearcher之前嘗試手動調用該方法。