近實時搜尋就是他能開啟乙個indexwriter快速搜尋索引變更的內容,而不必關閉writer,或者向writer提交,這個功能是在2.9版本以後引入的,在以前沒有這個功能時,必須呼叫writer的commit方法,然後重新開啟reader,這個過程很耗費時間,因為writer的提交必須對索引裡的所有新檔案進行同步,同步操作耗費系統資源,近實時搜尋使我們能夠對新建立還未提交的索引進行搜尋。
在4.5的版本上做乙個簡單的測試示例,參考lucene in action
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
//indexreader reader = writer.getreader(); // 老版本的 3.x
directoryreader reader = directoryreader.open(writer,true); //建立近實時reader
indexsearcher searcher = new indexsearcher(reader); //將reader封裝在indexsearcher
query query = new termquery(new term("test", "aaa"));
topdocs docs = searcher.search(query, 1);
assertequals(10, docs.totalhits); // 返回10個搜尋結果
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 = reader.reopen(); //老版本3.x
indexreader newreader = directoryreader.openifchanged(reader,writer,true); //重啟reader
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。
最後測試通過
Lucene 如何編寫Lucene程式
lucene版本 7.1 使用lucene的關鍵點 建立文件 document 新增檔案 field 儲存了原始資料資訊 把文件加入indexwriter 使用queryparser.parse 構建查詢內容 使用indexsearcher的search 方法,進行查詢 一 建立索引基本流程 ope...
Lucene學習二 Lucene總體框架
lucene總的來說是 在lucene in action中,lucene 的構架和過程如下圖,說明lucene是有索引和搜尋的兩個過程,包含索引建立,索引,搜尋三個要點。讓我們更細一些看lucene的各元件 那麼如何應用這些元件呢?讓我們再詳細到對lucene api 的呼叫實現索引和搜尋過程。搜...
lucene學習二 lucene分詞器
分詞器的作用 在建立索引時會用到分詞器,在使用字串搜尋時也會用到分詞器,這兩個地方要使用同乙個分詞器,否則可能會搜尋不出結果。analyzer 分詞器 的作用是把一段文字中的詞按規則取出所包含的所有詞。對應的是analyzer類,這是乙個抽象類,切分詞的具體規則是由子類實現的,所以對於不同的語言 規...