1 //指定索引庫文件存放文件位置 2 FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDataDir), new NativeFSLockFactory()); 3 //判斷索引文件目錄是否存在 4 bool isExist = IndexReader.IndexExists(directory); 5 if (isExist) 6 { 7 if (IndexWriter.IsLocked(directory)) 8 { 9 IndexWriter.Unlock(directory);10 }11 }12 //盤古分詞器13 PanGuAnalyzer analyzer = new PanGuAnalyzer();14 //索引寫入類15 IndexWriter writer = new IndexWriter(directory, analyzer, !isExist, IndexWriter.MaxFieldLength.UNLIMITED);16 //循環隊列執行操作17 while (IndexDataQueue.Count > 0)18 {19 Document document = new Document();20 //這是我為索引數據自定義的模型類,主要內容是文件的路徑、名稱、內容和索引管理的操作類型(新增、更新、刪除)21 BaseDataMode mode = IndexDataQueue.Dequeue();22 switch (mode.Type)23 {24 case OperationType.Insert:25 {26 foreach (KeyValuePair<string, string> kv in mode.Content)27 {28 //這里kv.Key是設置索引內字段的名稱,kv.Value是這個字段內存儲的內容。29 document.Add(new Field(kv.Key, kv.Value, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));30 }31 writer.AddDocument(document);32 }; break;33 case OperationType.Update:34 {35 //設置刪除條件36 MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "id" }, analyzer);37 Query query = parser.Parse(mode.Content["id"]);38 writer.DeleteDocuments(query);39 foreach (KeyValuePair<string, string> kv in mode.Content)40 {41 document.Add(new Field(kv.Key, kv.Value, Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));42 }43 writer.AddDocument(document);44 }; break;45 case OperationType.Delete:46 {47 MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "id" }, analyzer);48 Query query = parser.Parse(mode.Content["id"]);49 writer.DeleteDocuments(query);50 }; break;51 default: { }; break;52 }53 }54 //提交操作55 writer.Commit();56 //優化57 writer.Optimize();58 //關閉連接59 writer.Close();60 directory.Close();
1 //指定索引庫文件存放文件位置 2 FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDir), new NativeFSLockFactory()); 3 IndexReader reader = IndexReader.Open(directory, true); 4 IndexSearcher searcher = new IndexSearcher(reader); 5 //設置關鍵詞在條件中為OR關系 6 BooleanQuery queryOr = new BooleanQuery(); 7 foreach (string Word in SplitContent.SplitByPanGu(keyword)) 8 { 9 foreach (KeyValuePair<string, string> kv in Mode.Content)10 {11 TermQuery query = new TermQuery(new Term(kv.Key, word));12 //這里設置條件為Or關系13 queryOr.Add(query, BooleanClause.Occur.SHOULD);14 }15 }16 //獲取搜索結果 17 //1000為搜索文件的下標限制,設置這個可以控制檢索的范圍,也可以用于分頁顯示18 TopDocs tds = searcher.Search(queryOr, null, 1000);19 ScoreDoc[] docs = tds.scoreDocs;20 for (int i = 0; i < docs.Length; i++)21 {22 int docId = docs[i].doc;23 Document doc = searcher.Doc(docId);24 string content = doc.Get("索引內字段的名稱");25 }26
DLL與詞庫:http://download.csdn.net/detail/aaakingwin/7208679
新聞熱點
疑難解答