apache lucene-建立自己的搜尋引擎-刪除已建立索引資料

當索引資料已被建立,需要刪除此筆資document料時,只要利用索引key值查到此筆資料document,然後利用deleteDocuments來刪除此筆資料document。

lucene有二種索引存放方式

  1. RAM Directory記憶體,速度快,但程式結束後資料就不見了
  2. 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個結果

發表迴響