Lucene.Net 刪除特定索引

摘要:Lucene.Net 刪除特定索引

 在我們之前建置索引的方式幾乎都是使用重作或者 append 的方式 , 

 

而我們底下將介紹 IndexReader 這個 class ,

 

它主要負責索引的維護 , 如刪除索引 , 開啟索引等..   

 

以下範例為刪除特定索引 : 

 

Step 1 : Build RAMDirectory 

 

static RAMDirectory dir = new RAMDirectory();

 

Step 2 : Build Index 

 

在裡面建立了 3 份文件 , 建立了兩個欄位 , PROD_ID 和 PROD_Name  , 以下為我們建立的索引資料 

 

PROD_ID PROD_Name
1 Lucene.Net
2 Apache Lucene.Net
3 Tomcat
​
private void BuildIndex()
    {
        IndexWriter iw = new IndexWriter(dir, new  StandardAnalyzer(Version.LUCENE_30),true, IndexWriter.MaxFieldLength.UNLIMITED);
        
        Document doc = new Document();
        doc.Add(new Field("PROD_ID", "1", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
        doc.Add(new Field("PROD_Name", "Lucene.Net", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
       

        Document doc2 = new Document();
        doc2.Add(new Field("PROD_ID", "2", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
        doc2.Add(new Field("PROD_Name", "Apache Lucene.Net", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
       


        Document doc3 = new Document();
        doc3.Add(new Field("PROD_ID", "3", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
        doc3.Add(new Field("PROD_Name", "Tomcat", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
        
        iw.AddDocument(doc);
        iw.AddDocument(doc2);
        iw.AddDocument(doc3);

        iw.Optimize();
        iw.Commit();
        iw.Close();
    }

 

Step 3 : Search 

 

private void Search(string KeyWord)
    {

        IndexSearcher search = new IndexSearcher(dir, true);

        QueryParser parser = new QueryParser(Version.LUCENE_30, "PROD_Name", new StandardAnalyzer(Version.LUCENE_30));

        parser.AllowLeadingWildcard = true;

        Query query = parser.Parse(KeyWord);

        var hits = search.Search(query, null, search.MaxDoc).ScoreDocs;

        foreach (var res in hits)
        {
            Response.Write(string.Format("PROD_ID:{0} / PROD_Name{1}"
                                        , search.Doc(res.Doc).Get("PROD_ID").ToString()
                                        , search.Doc(res.Doc).Get("PROD_Name").ToString() + "
"));
        }
    }

 

Step 4 : Delete Index 

 

IndexReader 提供一個靜態方法取得 IndexReader 實體 , 如 Line : 3 , 

 

private void DeleteIndex() {

        IndexReader ir = IndexReader.Open(dir, false);
        ir.DeleteDocuments(new Term("PROD_ID", "3"));
        //在3.03 version  IndexReader.close已經 deprecated , 請直接使用 Dispose
        ir.Dispose();

    }

 

 DeleteDocuments 是屬於批次刪除的方法 , 可以針對特定欄位如 PROD_ID 的特定資料格式

 

去做刪除的動作 , 例如我們可以將 Line 4 修改如下 , 把所有含有 lucene 的資料全部刪除

 
ir.DeleteDocuments(new Term("PROD_Name", "lucene.net"));

 

 
 

Step 5 : 執行 : 

        BuildIndex();

        Search("*");

        DeleteIndex();

        Response.Write("<hr>");

        Search("*");

 

Result : 

 

以下示範了沒有刪除索引前跟刪除索引後的資料清單差別 

 

第一個結果還有出現 ID 為 3 的資料 , 在第二個資料集中已無出現

 

PROD_ID:1 / PROD_Name:Lucene.Net
PROD_ID:2 / PROD_Name:Apache Lucene.Net
PROD_ID:3 / PROD_Name:Tomcat


PROD_ID:1 / PROD_Name:Lucene.Net
PROD_ID:2 / PROD_Name:Apache Lucene.Net

 

IndexReader 也提供了一些不錯的方法 ,

 

IndexReader.Version [ long ] :  檢視目前索引的版本 , 也是索引建立時的時間

 

IndexReader ir = IndexReader.Open(dir, false);

Response.Write(ir.Version);

 

numDocs [ int ] : 目前索引內有多少個 Document 

 

 IndexReader ir = IndexReader.Open(dir, false);

 Response.Write(ir.NumDocs());