lucene4 5近實時搜尋

2021-06-19 01:49:20 字數 2488 閱讀 7419

近實時搜尋就是他能開啟乙個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類,這是乙個抽象類,切分詞的具體規則是由子類實現的,所以對於不同的語言 規...