當索引資料已被建立,需要刪除此筆資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個結果