當索引資料已被建立,需要刪除此筆資document料時,只要利用索引key值查到此筆資料document,然後利用deleteDocuments來刪除此筆資料document。
lucene有二種索引存放方式
- RAM Directory記憶體,速度快,但程式結束後資料就不見了
- FS Directory檔案系統,資料永久存在,一般比較常用
程式範例先建立二筆資料document,然後對第一筆資料document的test這個key field做刪除動作。此範例使用Ram Directory記憶體來存放索引值,可以與上一篇範例製作索引檔做比較。
原始碼:
package testlucene;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;
public class DeleteTest {
public static void main(String[] args) throws Exception {
// 建構兩個文件檔案物件
Document doc1 = new Document();
doc1.add(new Field("name", "key1 key2 key3", Field.Store.YES,
Field.Index.TOKENIZED));
//做為刪除的索引key值
doc1.add(new Field("test", "testword", Field.Store.YES,
Field.Index.TOKENIZED));
Document doc2 = new Document();
doc2.add(new Field("name", "key4 key5 key6", Field.Store.YES,
Field.Index.TOKENIZED));
doc2.add(new Field("name", "key1 key2 key3", Field.Store.YES,
Field.Index.TOKENIZED));
// 為兩個文件檔案建立索引
//把文件存入記憶體
org.apache.lucene.store.RAMDirectory ram =
new org.apache.lucene.store.RAMDirectory();
IndexWriter writer =
new IndexWriter(ram, new StandardAnalyzer(), true);
writer.addDocument(doc1);
writer.addDocument(doc2);
//記得要close才會寫入
writer.close();
//以上是建立索引
// 使用IndexReader刪除文件檔案
IndexReader reader = IndexReader.open(ram);
reader.deleteDocuments(new Term("test", "testword"));
reader.close();
// 建構檢索器,重新查詢看看
IndexSearcher searcher = new IndexSearcher(ram);
Query query = null;
Hits hits = null;
//測試 搜索
query = new QueryParser("name",
new StandardAnalyzer()).parse("key1");
hits = searcher.search(query);
System.out.println("搜尋 key1 共" + hits.length() + "個結果");
query = new QueryParser("name",
new StandardAnalyzer()).parse("key2");
hits = searcher.search(query);
System.out.println("搜尋 key2 共" + hits.length() + "個結果");
}
}
查詢資料的方式可以參考apache lucene搜尋製作
範例執行結果:
搜尋 key1 共1個結果
搜尋 key2 共1個結果