1. 程式人生 > >Lucene近實時搜尋

Lucene近實時搜尋

       Lucene是一個功能強大的全文檢索工具,許多搜尋都是基於它來做的,但是他的每個版本之間,都有差異,不同版本建的索引庫,都必須要用建索引時用的那個版本的API才能讀;相容性做的不是很好,也可能是為了效能,再優化之後就把以前的API廢除掉了。

       我最近在做近實時搜尋時,就遇到了這問題,Lucene4.4之前,一般都是用NRTManager,後臺執行緒定期重新整理索引的Reader 和Writer,使用者不容關心,只要通過NRTManager就可以新增,更新和刪除文件,並且通過NRTManager獲取IndexSearch,馬上就可以查到新增的文件,實現近實時搜尋。具體的程式碼:

初始化NRTManager ,並開啟一個後臺執行緒:

            Directory d = FSDirectory.open(new File("c:/index"));
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
            IndexWriterConfig iwc= new IndexWriterConfig(Version.LUCENE_35, analyzer);
            indexWriter = new IndexWriter(d, iwc);
            NRTManager nrtMgr= new 

NRTManager(indexWriter , new SearcherWarmer(){

                    @Override

                    public void warm(IndexSearcher s) throws IOException{

                    }

            });

           NRTManagerReopenThread nrtManagerReopenThread = new NRTManagerReopenThread(nrtMgr, 5.0, 0.025);

   nrtManagerReopenThread.setName("nrt reopen thread");


           nrtManagerReopenThread .setDaemon(true);
           nrtManagerReopenThread .start();

           SearcherManager mgr= nrtMgr.getSearcherManager(true);

新增文件:

           nrtMgr.add(...);

獲取索引:

            indexSearcher = mgr.acquire();

            ......

            searcherManager.release(indexSearcher );

Lucene4.4之後,NRTManager 及NRTManagerReopenThread 已經都沒有了,如果做近實時搜尋的話,就要這麼做,

初始化:

   Directory directory = new RAMDirectory();
   IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_48, new StandardAnalyzer(ver));
   IndexWriter indexWriter = new IndexWriter(directory, iwc);
   TrackingIndexWriter trackWriter = new TrackingIndexWriter(indexWriter);
   searcherManager = new SearcherManager(indexWriter, true, new SearcherFactory());
   
   ControlledRealTimeReopenThread<IndexSearcher> CRTReopenThread =
     new ControlledRealTimeReopenThread<IndexSearcher>(trackWriter, searcherManager, 5.0, 0.025) ;

   CRTReopenThread.setDaemon(true);
   CRTReopenThread.setName("後臺重新整理服務");
   CRTReopenThread.start();

新增文件:

trackWriter.addDocument(doc);

進行搜尋:

IndexSearcher searcher = searcherManager.acquire();

......

searcherManager.release(searcher);

我在找了原始碼裡找了很久才發現ControlledRealTimeReopenThread這個類,所以做Lucene開發,檢視原始碼還是很重要的。

相關推薦

Lucene實時搜尋應用總結

最近因工作需要,用到了Lucene,在需求中,需要對生成的索引檔案不斷的更新、新增、刪除等操作,同時還要實時的看到索引改動後的資料,在使用過程中碰到了Lucene裡幾個比較常見的問題,特來總結記錄下。 我使用的是Lucene4.3,本來是想使用最高的版本Lucene4.9的

lucene學習筆記(七)lucene實時搜尋

近實時搜尋 Lucene3.5起提供了NRTManager管理近實時搜尋。原理:將搜尋存放到記憶體中,每個一定時間提交到硬碟中。 NRTManager和SearchManager是執行緒安全的 使用NRTManager獲取SearchManager。並且使

Lucene實時搜尋

       Lucene是一個功能強大的全文檢索工具,許多搜尋都是基於它來做的,但是他的每個版本之間,都有差異,不同版本建的索引庫,都必須要用建索引時用的那個版本的API才能讀;相容性做的不是很好,也可能是為了效能,再優化之後就把以前的API廢除掉了。        我最

lucene 實時搜尋例項

package com.jiepu.lucene_30; import org.apache.lucene.util.Version; import org.apache.lucene.store.*; import org.apache.lucene.index.*;

Lucene筆記37-Lucene如何通過NRTManager和SearchManager實現實時搜尋

一、思路分析 如何實現近實時搜尋呢?每次更新完索引都commit?那恐怕太浪費資源了,當資料量非常龐大的時候,幾乎不可能。這裡有兩種方案。 使用SearchManager來管理IndexSearcher物件,當發現索引更新之後,searchManager會呼叫maybeReopen

lucene 4.x 實時搜尋

請支援原創部落格 http://blog.csdn.net/cl59452/article/details/38408741 lucene2.9 之後推出了nrtmanager  近實時搜尋,但是很多人在lucene4.x 中找不到了,我通過查閱apache 的log 發現

Lucene中的實時搜尋SearcherManager

近實時搜尋(near-real-time)可以搜尋IndexWriter還未commit的內容。 Index索引的重新整理過程: 只有IndexWriter上的commit操作才會導致Ram Directory記憶體上的資料完全同步到檔案。 Index

Lucene實時搜尋

近實時搜尋:可以使用一個開啟的IndexWriter快速搜尋索引的變更內容,而不必首先關閉writer,或者向該writer提交;這是2.9版本之後推出的新功能。 程式碼示例(本例參考《Lucene In Action》): package com.tan.code; i

lucene學習之實時搜尋

下面是近實時搜尋的一個例子 public class IndexFenci {private static String[] ids = {"1","2","3"};private static String[] citys = {"北京","南京","上海"};priva

21、學習Lucene3.5索引之實時搜尋常用工具類

public class LuceneContext { /** * 將該類設定成單例模式,向外只開放輕量級的介面(諸如:IndexSearcher), * 重量級的變數(諸如:NRTManager、SearcherManager)全部設成

通過NRTManager和SearchManager實現實時搜尋

    public void update() {        try {            /*             * Lucene並沒有提供更新,這裡的更新操作其實是如下兩個操作的合集             * 先刪除之後再新增             */            Docu

ElasticSearch + Canal 開發千萬級的實時搜尋系統【轉】

公司是做社交相關產品的,社交類產品對搜尋功能需求要求就比較高,需要根據使用者城市、使用者ID暱稱等進行搜尋。 專案原先的搜尋介面採用SQL查詢的方式實現,資料庫表採用了按城市分表的方式。但隨著業務的發展,搜尋介面呼叫頻次越來越高,搜尋介面壓力越來越大,搜尋資料庫經常崩潰,從而導致搜尋功能經常不能

ElasticSearch最佳入門實踐(六十八)優化寫入流程實現NRT實時(filesystem cache,refresh)

現有流程的問題,每次都必須等待fsync將segment刷入磁碟,才能將segment開啟供search使用,這樣的話,從一個document寫入,到它可以被搜尋,可能會超過1分鐘!!!這就不是近實時的搜尋了!!!主要瓶頸在於fsync實際發生磁碟IO寫資料進磁碟,是很耗時的。

angular專案隨筆——前端實現實時搜尋展示搜尋列表

1. 在專案中,會遇到初始化頁面是一個列表,但頁面中包含有一個input搜尋框,輸入關鍵字搜尋的時候,列表需要實時變化,列表條目總數也需要實時變化。類似下圖的需求。 解決方案如下: <input placeholder="輸入映象名稱查詢" ng-model="projectImage

lucene索引並搜尋mysql資料庫

 由於對lucene比較感興趣,本人在網上找了點資料,終於成功地用lucene對 MySQL 資料庫 進行索引建立併成功搜尋,先總結如下:     首先介紹一個jdbc工具類,用於得到Connection物件:

input實時搜尋

結構為上方input輸入框,下方一個select控制元件顯示匹配列表。 input對應的事件為:compositionstart compositionend input focus, 其中input在輸入內容改變時觸發。compositionstart和compositionend的作

實時搜尋 elasticsearch vs solr

oyhk學習筆記 什麼是ElasticSearch? ElasticSearch是基於rest風格,分散式搜尋引擎,非常優秀的lucene庫.內建的JSON API提供了一個優雅的+ HTTP平臺完美的結合(例:彈性可搜尋的ruby gem)。它的簡單的、可伸縮的和酷

基於Vue實現關鍵詞實時搜尋高亮顯示關鍵詞

最近在做移動real-time-search於實時搜尋和關鍵詞高亮顯示的功能,通過部落格的方式總結一下,同時希望能夠幫助到別人~~~ 好了閒話不多說直接上程式碼 實時搜尋 實時搜尋通過觸發input事件和定時器來實現 <input v-model="keyW

Lucene(一):資料庫搜尋弊端以及全文搜尋的概念

生活中的搜尋 相關的搜尋實際上無處不在,比如百度的搜尋,Ecplise中的Help搜尋,Windows系統中的檔案搜尋等 我們通常從搜尋結果中經常發現有這麼一種規律:越是符合條件的搜尋結果會放在前面,不太符合條件的搜尋結果會排在後面,並且通常會設定字型高亮

10、索引庫的查詢四之:Lucene的高階搜尋技術

Lucene的高階搜尋技術首先要說的就是 SpanTermQuery ,他和TermQuery用法很相似,唯一區別就是SapnTermQuery可以得到Term的span跨度資訊,用法如下:@Test