1、索引的管理
//指定索引庫文件存放文件位置FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDataDir), new NativeFSLockFactory());//判斷索引文件目錄是否存在bool isExist = IndexReader.IndexExists(directory);if (isExist){ if (IndexWriter.IsLocked(directory)) { IndexWriter.Unlock(directory); }}//盤古分詞器PanGuAnalyzer analyzer = new PanGuAnalyzer();//索引寫入類IndexWriter writer = new IndexWriter(directory, analyzer, !isExist, IndexWriter.MaxFieldLength.UNLIMITED);//循環隊列執行操作while (IndexDataQueue.Count > 0){ Document document = new Document();//這是我為索引數據自定義的模型類,主要內容是文件的路徑、名稱、內容和索引管理的操作類型(新增、更新、刪除) BaseDataMode mode = IndexDataQueue.Dequeue(); switch (mode.Type) { case OperationType.Insert: { foreach (KeyValuePair<string, string> kv in mode.Content) { //這里kv.Key是設置索引內字段的名稱,kv.Value是這個字段內存儲的內容。 document.Add(new Field(kv.Key, kv.Value, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS)); } writer.AddDocument(document); }; break; case OperationType.Update: { //設置刪除條件 MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "id" }, analyzer); Query query = parser.Parse(mode.Content["id"]); writer.DeleteDocuments(query); foreach (KeyValuePair<string, string> kv in mode.Content) { document.Add(new Field(kv.Key, kv.Value, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS)); } writer.AddDocument(document); }; break; case OperationType.Delete: { MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "id" }, analyzer); Query query = parser.Parse(mode.Content["id"]); writer.DeleteDocuments(query); }; break; default: { }; break; }}//提交操作writer.Commit();//優化writer.Optimize();//關閉連接writer.Close();directory.Close();2、檢索
//指定索引庫文件存放文件位置FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDir), new NativeFSLockFactory());IndexReader reader = IndexReader.Open(directory, true);IndexSearcher searcher = new IndexSearcher(reader);//設置關鍵詞在條件中為OR關系BooleanQuery queryOr = new BooleanQuery();foreach (string Word in SplitContent.SplitByPanGu(keyword)){ foreach (KeyValuePair<string, string> kv in Mode.Content) { TermQuery query = new TermQuery(new Term(kv.Key, word)); //這里設置條件為Or關系 queryOr.Add(query, BooleanClause.Occur.SHOULD); }}//獲取搜索結果 //1000為搜索文件的下標限制,設置這個可以控制檢索的范圍,也可以用于分頁顯示TopDocs tds = searcher.Search(queryOr, null, 1000);ScoreDoc[] docs = tds.scoreDocs;for (int i = 0; i < docs.Length; i++){ int docId = docs[i].doc; Document doc = searcher.Doc(docId);string content = doc.Get("索引內字段的名稱");}
轉自:http://www.survivalescaperooms.com/liusuqi/p/3671161.html
新聞熱點
疑難解答