摘要: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());