生活随笔
收集整理的這篇文章主要介紹了
lucene4.5近实时搜索
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
近實時搜索就是他能打開一個IndexWriter快速搜索索引變更的內容,而不必關閉writer,或者向writer提交,這個功能是在2.9版本以后引入的,在以前沒有這個功能時,必須調用writer的commit方法,然后重新打開reader,這個過程很耗費時間,因為writer的提交必須對索引里的所有新文件進行同步,同步操作耗費系統資源,近實時搜索使我們能夠對新創建還未提交的索引進行搜索。
?
? 在4.5的版本上做一個簡單的測試示例,參考lucene in action
?
[java]?view plaincopyprint?
import?junit.framework.TestCase;??import?org.apache.lucene.analysis.standard.StandardAnalyzer;??import?org.apache.lucene.document.Document;??import?org.apache.lucene.document.Field;??import?org.apache.lucene.document.FieldType;??import?org.apache.lucene.document.TextField;??import?org.apache.lucene.index.*;??import?org.apache.lucene.search.IndexSearcher;??import?org.apache.lucene.search.Query;??import?org.apache.lucene.search.TermQuery;??import?org.apache.lucene.search.TopDocs;??import?org.apache.lucene.store.Directory;??import?org.apache.lucene.store.RAMDirectory;??import?org.apache.lucene.util.Version;??????public?class?NearRealTimeTest?extends?TestCase?{????public?void?testNearRealTime()?throws?Exception?{??????Directory?dir?=?new?RAMDirectory();??????IndexWriterConfig?config?=??new?IndexWriterConfig(Version.LUCENE_45,new?StandardAnalyzer(Version.LUCENE_45));??????IndexWriter?writer?=?new?IndexWriter(dir,?config);????????FieldType?fieldType?=?new?FieldType();????????fieldType.setIndexed(false);????????fieldType.setStored(false);????????fieldType.setTokenized(true);????????fieldType.setOmitNorms(false);??????for(int?i=0;i<10;i++)?{????????Document?doc?=?new?Document();????????doc.add(new?Field("id",?""+i,?fieldType));????????doc.add(new?Field("test",?"aaa",?TextField.TYPE_NOT_STORED));????????writer.addDocument(doc);??????}????????????DirectoryReader?reader?=?DirectoryReader.open(writer,true);?????????IndexSearcher?searcher?=?new?IndexSearcher(reader);???????????Query?query?=?new?TermQuery(new?Term("test",?"aaa"));??????TopDocs?docs?=?searcher.search(query,?1);??????assertEquals(10,?docs.totalHits);????????????????????????????????writer.deleteDocuments(new?Term("id",?"7"));?????????????????????Document?doc?=?new?Document();????????doc.add(new?Field("id",?"11",??fieldType));??????doc.add(new?Field("test",?"bbb",??TextField.TYPE_NOT_STORED));??????writer.addDocument(doc);??????????????????IndexReader?newReader?=?DirectoryReader.openIfChanged(reader,writer,true);?????????reader.close();??????assertFalse(reader?==?newReader);??????reader.close();??????searcher?=?new?IndexSearcher(newReader);????????TopDocs?hits?=?searcher.search(query,?10);??????assertEquals(9,?hits.totalHits);????????query?=?new?TermQuery(new?Term("text",?"bbb"));??????hits?=?searcher.search(query,?1);??????assertEquals(1,?hits.totalHits);????????newReader.close();??????writer.close();????}??}?? 可以看到更新文檔后用 DirctoryReader.openIfChanged來獲取Reader,如果有新內容,則返回新的Reader,這時我們需要關閉老的Reader。
?
最后測試通過
轉載于:https://www.cnblogs.com/zhwl/p/3499557.html
總結
以上是生活随笔為你收集整理的lucene4.5近实时搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。