1. 程式人生 > >lucene 4.x 近實時搜尋

lucene 4.x 近實時搜尋

請支援原創部落格 http://blog.csdn.net/cl59452/article/details/38408741

lucene2.9 之後推出了nrtmanager  近實時搜尋,但是很多人在lucene4.x 中找不到了,我通過查閱apache 的log 發現,lucene已經用ControlledRealTimeReopenThread將nrtmanager替代了具體的實現過程如下:

public class IndexUtil {
    
    private SearcherManager mgr;
    private IndexWriter writer;
    private TrackingIndexWriter tkWriter;
    private ControlledRealTimeReopenThread<IndexSearcher> crtThread;
//    private String path ;
    
    public IndexUtil(String path){
        try {
            Directory fsDir = FSDirectory.open(new File(path));
            //建立writer
            writer = new IndexWriter(fsDir,new IndexWriterConfig(Version.LUCENE_47,new IKAnalyzer(true)));
            //新建SearcherManager
            //true 表示在記憶體中刪除,false可能刪可能不刪,設為false效能會更好一些
            mgr = new SearcherManager(writer,false,new SearcherFactory());
            //ControlledRealTimeReopenThread 構造是必須有的,主要將writer裝,每個方法都沒有commit 操作。
            tkWriter = new TrackingIndexWriter(writer);//為writer 包裝了一層
            //建立執行緒,執行緒安全的,我們不須處理    
            crtThread = new ControlledRealTimeReopenThread<IndexSearcher>(tkWriter, mgr, 5.0, 0.025);
            crtThread.setDaemon(true);//設為後臺程序
            crtThread.setName("我是好人");
            crtThread.start();//啟動執行緒
//            crtThread.
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    public void search(){
        IndexSearcher searcher = null;
        try {
 
            //更新看看記憶體中索引是否有變化如果,有一個更新了,其他執行緒也會更新
 
           mgr.maybeRefresh();
 
            //利用acquire 方法獲取search,執行此方法前須執行maybeRefresh
            searcher = mgr.acquire();
           IndexSearcher tr = mgr.refreshIfNeeded(searcher);
 
            String fields[] = {"body","name"};
            QueryParser qp = new MultiFieldQueryParser(Version.LUCENE_47,fields,new IKAnalyzer(true));
            Query query =new TermQuery(new Term("id", "2"));// qp.parse("中國");
            TopDocs tds = searcher.search(query, 5);
            ScoreDoc[] sds = tds.scoreDocs;
            for(ScoreDoc sd:sds){
                Document d = searcher.doc(sd.doc);
                System.out.println(d.get("name")+d.get("body")/*+d.get("id")*/);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } /*catch (ParseException e) {
            e.printStackTrace();
        }*/finally{
 
            try {
 
               //釋放searcher,
                mgr.release(searcher);
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("------------------------------------------------------------------------------------------------");
        }
 
    }
}
實現原理:
只有Index Writer上的commit操作才會導致ram directory上的資料完全同步到檔案。Index Writer提供了實時獲得reader的API,這個呼叫將導致flush操作,生成新的segment,但不會commit(fsync),從而減少 了IO。新的segment被加入到新生成的
reader裡。從返回的reader裡,可以看到更新。所以,只要每次新的搜尋都從IndexWriter獲得一個新的reader,就可以搜尋到最新的內容。這一操作的開銷僅僅是flush,相對commit來說,開銷很小。

Lucene的index組織方式為一個index目錄下的多個segment。新的doc會加入新的segment裡,這些新的小segment每隔一段時間就合併起來。因為合併,總的segment數

量保持的較小,總體search速度仍然很快。為了防止讀寫衝突,lucene只建立新的segment,並在任何active的reader不在使用後刪除掉老的segment。

flush是把資料寫入到作業系統的緩衝區,只要緩衝區不滿,就不會有硬碟操作。

commit是把所有記憶體緩衝區的資料寫入到硬碟,是完全的硬碟操作。

重量級操作。這是因為,Lucene索引中最主要的結構posting通過VINT和delta的格式存

儲並緊密排列。合併時要對同一個term的posting進行歸併排序,是一個讀出,合併再生

成的過程。
--------------------- 
作者:cl59452 
來源:CSDN 
原文:https://blog.csdn.net/cl59452/article/details/38408741 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

相關推薦

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學習之實時搜尋

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

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

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

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實時搜尋

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

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

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

Lucene 4.X 倒排索引原理與實現: (1) 詞典的設計

詞典的格式設計 詞典中所儲存的資訊主要是三部分: Term字串 Term的統計資訊,比如文件頻率(Document Frequency) 倒排表的位置資訊 其中Term字串如何儲存是一個很大的問題,根據上一章基本原理的表述中,我們知道,寫入檔案的Term是按照字典順序排好序的,那麼如何將這些

通過NRTManager和SearchManager實現實時搜尋

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

Solr 4.x定時、實時增量索引

  開始之前,可以參考上篇博文增量索引-資料匯入並索引:           Solr增量索引配置 一、開始增量索引前的準備工作。 1、認識data-config.xml中相關屬性        <!--  transformer 格式轉化:HTMLStripT

Lucene 4.4 基於字首搜尋

package com.zsj.test; import java.io.File; import java.io.IOException; import org.apache.lucene.document.Document; import org.apache.luce

OpenLDAP學習筆記(基於OpenLDAP-2.4.x

ldap slapd 同步 1.1、什麽是目錄服務(Directory Services)? 目錄是一個特殊的數據庫,專門用於搜索和瀏覽,另外也支持基本的查詢和更新功能。 目錄是一個為查詢、瀏覽和搜索而優化的專業分布式數據庫,它呈樹狀結構組織數據,就好象Linux/Unix系統中的文件

CentOs6.x安裝mongodb3.4.x

mongo mongodb mongo報錯 linux安裝mongodb 一、系統及安裝說明 系統:CentOS6.x_x64,mongodb-3.4.10。mongodb官方下載地址 https://fastdl.mongodb.org/linux/mongodb-linux-x8

arcgis api 4.x for js之基礎地圖篇

事件 之前 通過 時間 res webgl 參數說明 event inpu arcgis api3.x for js轉向arcgis api4.x,我也是最近的3-4個月時間的事情,剛好公司有個webgis項目需要展示三維場景,項目選擇arcgis api4.x。我純碎記錄

Android 4.X 系統加載 so 失敗的原因分析

tabs mod ext 問題 用戶 統計數據 crash 情況 text 1 so 加載過程 so 加載的過程可以參考小米的系統工程師的文章loadLibrary動態庫加載過程分析 2 問題分析 2.1 問題 年前項目裏新加了一個 so庫,但發現native 方法的找不到

.Net 4.X 提前用上 .Net Core 的配置模式以及熱重載配置

returns ets manage 自動生成 studio 127.0.0.1 文件中 讀取配置 應用程序 1. 前言 在提倡微服務及 Serverless 越來越普及的當下,傳統 .Net 應用的配置模式往往依賴於一個名為 web.config 的 XML 文件,在可擴

ArcGIS API for JavaScript 4.x 與 npm

resolved 進行 ali IE fun IT rop async creat 在4.7版本中,不僅增加了WebGL的渲染支持(渲染前端速度加快,渲染量也加大)、增強了ES6中的Promises語法支持,還支持了npm管理及webpack打包,實屬喜訊。 “意味著可以