2012-02-06 70 views
1

玩弄Lucene。試圖讓我的更改對其他閱讀主題可見。沒有重建索引。爲此,我使用SearcherManager類。Java Lucene NRT搜索不起作用

經理的創作

Directory index = new SimpleFSDirectory(new File(LUCENE_INDEX_PATH)); 
w = new IndexWriter(index, config); 
indexReader = IndexReader.open(w, true); 
manager = new SearcherManager(w, true, null, null); 

更新請求

w.updateDocument(t, document); 
manager.maybeReopen(); // openIfChanged same behavior 
w.commit(); 

搜索請求

IndexSearcher searcher = manager.acquire(); 
try { 
    return performSearch(query, searcher, skip, limit); 
} finally { 
    manager.release(searcher); 
    searcher = null; 
} 

更改刷新到磁盤,但新的搜索請求後,才重新啓動應用程序看到他們(娛樂的指數)。看起來像IndexSearcher還指向舊索引。

回答

4

你不需要打開你自己的IndexReader;只需創建SearcherManager(從您的IndexWriter),然後使用它的獲取/發佈,以獲得一個搜索器/閱讀器。

使用作者添加/刪除文檔後,應該調用maybeReopen,然後在下次調用SearcherManager.acquire時,返回的搜索者將反映更改。最好使用後臺線程(即不是搜索的線程)索引文檔並調用maybeReopen。

您不需要調用IndexWriter.commit以使更改可見 - 僅當您需要持久性時才調用此選項(即,所有更改都安全地在磁盤上並且在OS/JVM崩潰,電源丟失, 9等)。

+0

是的,單獨的indexReader只是一個遺留代碼,已刪除。我確切地知道,當做出更改時,對我來說,最好是在同一個線程中調用maybeReopen。現在是唯一一個按Term來刪除文檔的問題。文件不會從索引中刪除可以請您提出常見的刪除方式嗎?在索引中可能更好地標記爲「已刪除」,並且僅更新文檔 – user12384512 2012-02-06 18:07:23

+0

如果您調用IndexWriter.deleteDocuments(Term),然後打開新的NRT閱讀器(applyAllDeletes傳遞true),則應該反映刪除。你確定你有合適的期限嗎? – 2012-04-05 14:26:16

0

如果要使用NRT搜索,請使用以IndexWriter爲參數的不同SearcherManager構造函數。檢查這篇文章http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html

+0

它不會改變我的任何事情。我嘗試了Writer的另一個構造函數 – user12384512 2012-02-06 15:03:10

+0

你確定嗎?而且您甚至不需要承諾能夠搜索新添加的文檔。 – naresh 2012-02-06 15:04:21

+0

是的,我用另一個配置更新了答案 – user12384512 2012-02-06 15:05:26

0

看起來像,我不應該創建IndexReader。

indexReader = IndexReader.open(w, true) 

如果我刪除這條線,一切正常。不知道爲什麼

+0

你在初始代碼中需要那個indexReader的地方? – naresh 2012-02-06 16:41:38

+0

因爲我開始使用經理,所以無處不在。 – user12384512 2012-02-06 17:24:45