2009-11-26 77 views
6

在我的項目中,我們使用Lucene 2.4.1進行全文搜索。這是一個J2EE項目,IndexSearcher創建一次。在後臺,索引每兩分鐘刷新一次(當內容發生變化時)。用戶可以通過頁面上的搜索機制來搜索索引。Lucene似乎在緩存搜索結果 - 爲什麼?

問題是,Lucene返回的結果好像被緩存了一些。

這情景,我注意到:

  • 我啓動應用程序,搜索「關鍵字」 - 6個返回結果,
  • 指數刷新,使用Luke我看到,有8個結果現在查詢「關鍵字」,
  • 我再次使用該應用程序進行搜索,同樣返回6個結果。

我分析了我們的配置,並沒有發現任何地方的緩存。我調試了搜索,並且沒有緩存出代碼,searcher.search返回了6個結果。

Lucene是否緩存內部結果?我應該檢查什麼屬性等?

回答

10

要查看IndexWriters對您有一個打開的IndexReader的索引所做的更改,請務必致電IndexReader.reopen()查看最新更改。

請確保您的IndexWriter正在通過顯式commit(),close()或將autoCommit設置爲true來提交更改。

+1

我每次更新索引時都會重新創建IndexSearcher來解決這個問題。這解決了這個問題。我認爲它的涵蓋範圍幾乎與你所說的相同。 – 2009-11-26 11:01:45

+4

reopen()更有效率,因爲重新創建它會導致讀取所有的段文件,但重新打開()知道只讀取自上次打開以來已更新的段。 – Cowan 2009-11-26 11:04:42

1

對於2.9.0之前的版本,Lucene會自動緩存查詢結果。對於更高版本,除非將查詢包裝在QueryFilter中,然後將結果包裝在CachingWrapperFilter中,否則不會進行緩存。如果重新打開索引成爲問題,你可以考慮切換到大於等於2.9.0的版本

1

另外需要注意的一點:爲了讓IndexReader找到其他線程實時更新的文件,當初始化IndexReader時,參數「只有「必須是假的。否則,方法reopen()將不起作用。