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打包,實屬喜訊。 “意味著可以