lucene是一個(gè)開放源代碼的全文搜索引擎開發(fā)工具包,提供了簡(jiǎn)單強(qiáng)大的搜索引擎接口其兴,其優(yōu)點(diǎn)如下:
數(shù)據(jù)以索引文件的形式存儲(chǔ)顶瞒,索引文件可以跨平臺(tái),只要保證索引完整元旬,復(fù)制到任何機(jī)器或者磁盤空間均可以查詢索引內(nèi)容榴徐;
在傳統(tǒng)全文檢索引擎的倒排索引的基礎(chǔ)上守问,實(shí)現(xiàn)了分塊索引,能夠針對(duì)新的文件建立小文件索引坑资,提升索引速度耗帕。然后通過(guò)與原有索引的合并,達(dá)到優(yōu)化的目的袱贮;
索引的構(gòu)建和查詢都十分簡(jiǎn)潔仿便,有強(qiáng)大的類庫(kù)實(shí)現(xiàn)相關(guān)功能;
開發(fā)源代碼攒巍,論壇和資源十分豐富嗽仪。
索引的構(gòu)建過(guò)程描述如下:
1)判斷JRE版本是否為64位和是否支持堆外內(nèi)存,并創(chuàng)建
1.1? 如果滿足條件柒莉,創(chuàng)建MMapDirectory闻坚,此種Directory可以有效的利用虛擬機(jī)內(nèi)存地址空間?;
1.2? 如果不滿足以上條件兢孝,判斷系統(tǒng)是否是windows,如果滿足條件窿凤,創(chuàng)建SimpleFSDirectory,此種directory提供了性能不太高的多線程支持跨蟹,lucene推薦使用NIOFSDirectory或者MMapDirectory來(lái)替代之雳殊;
1.3?如果以上均不滿足,創(chuàng)建NIOFSDirectory對(duì)象窗轩,此種directory的英文說(shuō)明為
An?FSDirectory?implementation?that?uses?java.nio's?FileChannel's?positional?read,?which?allows?multiple?threads?to?read?from?the?same?file?without?synchronizing
大意是一個(gè)利用了java nio中FileChannel的FSDirectory實(shí)現(xiàn)相种,允許無(wú)syschronized的對(duì)同一文件進(jìn)行多線程讀
2)詞庫(kù)分析器Analyzer創(chuàng)建(需要注意的是使用哪種Analyzer進(jìn)行索引查詢,創(chuàng)建的時(shí)候也要使用對(duì)應(yīng)的索引器品姓,否則查詢結(jié)果有問(wèn)題)
3)IndexWriterConfig對(duì)象創(chuàng)建,并獲取IndexWriter對(duì)象
3.1 判斷是覆蓋索引還是追加索引,如果是覆蓋索引indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
3.2 如果追加indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
4) 遍歷根據(jù)要索引的對(duì)象列表箫措,對(duì)單個(gè)對(duì)象的field進(jìn)行l(wèi)ucene相關(guān)field構(gòu)建腹备,添加到Document對(duì)象中
5)IndexWriter對(duì)索引進(jìn)行寫入;
6)IndexWriter執(zhí)行commit()和close()結(jié)束索引創(chuàng)建過(guò)程
以lucene5為例斤蔓,索引器的創(chuàng)建如下:
/**創(chuàng)建索引寫入器
*?@param?indexPath
*?@param?create
*?@return
*?@throws?IOException
*/
publicstaticIndexWriter?getIndexWriter(String?indexPath,booleancreate)throwsIOException{
Directory?dir?=?FSDirectory.open(Paths.get(indexPath,newString[0]));
Analyzer?analyzer?=newStandardAnalyzer();
IndexWriterConfig?iwc?=newIndexWriterConfig(analyzer);
if(create){
iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
}else{
iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
}
IndexWriter?writer?=newIndexWriter(dir,?iwc);
returnwriter;
}