Lucene近實時搜尋應用總結

2021-07-05 11:02:11 字數 1791 閱讀 5656

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

ok,進入正題。

//獲取索引的寫物件

public static indexwriter getindexwriter(string indexpath) throws exception

indexwriterconfig iwriterconfig = new indexwriterconfig(version.lucene_43, new complexanalyzer());

indexwriter indexwriter=new indexwriter(dir, iwriterconfig);

return indexwriter;

} //索引更新操作,索引中的更新邏輯是將舊的文件刪除,再將新的文件新增進去

public static void updatelucene(string indexpath,要更新的資料引數)

public indexsearcher getindexsearcher()  else if(indexsearcher != null && dirreader != null && !dirreader.iscurrent()) 

} catch (ioexception e)

}return indexsearcher;

}

private indexsearcher getindexsearcher() throws ioexception 

searchermanager.mayberefresh();//這個方法同directoryreader.openifchanged(dirreader)效果一樣,其實底層還是呼叫的該方法實現的

indexsearcher = searchermanager.acquire();//借用乙個indexsearcher物件的引用,記住該物件用完之後要歸還的,有借有還再借不難

}return indexsearcher;

}private void closeindexsearcher(indexsearcher indexsearcher) throws ioexception

indexsearcher = null;

}

如此實現之後,就不需要我們自己管理這個舊的reader物件,而是交由lucene本身自己去進行管理,而且此種實現方式更簡潔明瞭,也完美解決了我的問題。

實現了索引更新後的資料的讀取實時性就可以實現乙個簡單的實時搜尋功能。

最後為了保證專案中lucene使用的穩定性,我對索引檔案的更新和查詢都新增了讀寫鎖reentrantreadwritelock來進行控制,更新的時候新增寫鎖,查詢的時候新增讀鎖,這樣更加的保證了lucene使用的安全性。

簡單介紹下讀寫鎖reentrantreadwritelock的機制(多執行緒併發的時候很有用):

給個示例**:

private reentrantreadwritelock  w_lock = new reentrantreadwritelock();//讀寫鎖

public void updatedocument(term term, document doc) throws exception catch (ioexception e) finally

}

ok,到這裡我的問題基本上就寫完了,有時間再去研究研究lucene的其他的特性。

lucene4 5近實時搜尋

近實時搜尋就是他能開啟乙個indexwriter快速搜尋索引變更的內容,而不必關閉writer,或者向writer提交,這個功能是在2.9版本以後引入的,在以前沒有這個功能時,必須呼叫writer的commit方法,然後重新開啟reader,這個過程很耗費時間,因為writer的提交必須對索引裡的所...

近實時搜尋

隨著按段 per segment 搜尋的發展,乙個新的文件從索引到可被搜尋的延遲顯著降低了。新文件在幾分鐘之內即可被檢索,但這樣還是不夠快。磁碟在這裡成為了瓶頸。提交 commiting 乙個新的段到磁碟需要乙個fsync來確保段被物理性地寫入磁碟,這樣在斷電的時候就不會丟失資料。但是fsync操作...

lucene的實時更新

同一時刻只能有乙個對索引的寫操作,在寫的同時可以進行搜尋。但是實踐發現,對索引寫了之後,並不能馬上查詢到結果。如果重新 indexsearcher indexsearcher new lucene.net.search.indexsearcher parameter.indexpath 這樣就可以馬...