花了兩天的時間研究了下Lucene.Net 發現確實挺好玩.... 最新版本是3.0.3 (最後更新時間2012-10)web
惋惜3.0.3版本的Lucene.net沒法和盤古分詞 (最新版爲2.3.1.0 最後更新時間 2010-10)一塊兒使用.....由於盤古分詞 基於2.9.x.x版本 寫的 ,在 3.0.3中不少 接口 和 類名 發生了 變化..(固然 網上 也有解決方案 :基於新的接口 從新 編譯 盤古分詞)ide
今天主要用的是 Lucene.Net 2.9.2.2 與盤古分詞 2.3.0.0版本.this
主要功能就是 建立索引,和搜索 下面貼出 2段代碼spa
建立索引:.net
搜索代碼:3d
string indexPath = @"C:\lucenedir";//最好將該項放在配置文件中。 string kw = Request["txtContent"]; kw = kw.ToLower(); FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory()); IndexReader reader = IndexReader.Open(directory, true); IndexSearcher searcher = new IndexSearcher(reader); //搜索條件 //PhraseQuery query = new PhraseQuery(); BooleanQuery queryMsg = new BooleanQuery();//或者條件 TermQuery query = null; foreach (string word in Common.WebCommon.SplitWord(kw))//將用戶輸入的搜索內容進行了盤古分詞、 { query = new TermQuery(new Term("msg", word)); //query.Add(new Term("msg", word)); queryMsg.Add(query, BooleanClause.Occur.SHOULD); } //query.SetSlop(100);//多個查詢條件的詞之間的最大距離.在文章中相隔太遠 也就無心義.(例如 「大學生」這個查詢條件和"簡歷"這個查詢條件之間若是間隔的詞太多也就沒有意義了。) //TopScoreDocCollector是盛放查詢結果的容器 TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true); searcher.Search(queryMsg, null, collector);//根據query查詢條件進行查詢,查詢結果放入collector容器 ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;//獲得全部查詢結果中的文檔,GetTotalHits():表示總條數 TopDocs(300, 20);//表示獲得300(從300開始),到320(結束)的文檔內容. //能夠用來實現分頁功能 List<SearchResult> list = new List<SearchResult>(); for (int i = 0; i < docs.Length; i++) { // //搜索ScoreDoc[]只能得到文檔的id,這樣不會把查詢結果的Document一次性加載到內存中。下降了內存壓力,須要得到文檔的詳細內容的時候經過searcher.Doc來根據文檔id來得到文檔的詳細內容對象Document. int docId = docs[i].doc;//獲得查詢結果文檔的id(Lucene內部分配的id) Document doc = searcher.Doc(docId);//找到文檔id對應的文檔詳細信息 SearchResult result = new SearchResult(); result.Msg =Common.WebCommon.Highlight(kw,doc.Get("msg")); result.Title = doc.Get("title"); result.Url = "/BookDeatail.apsx?id=" + doc.Get("id"); list.Add(result); } this.SearchRepeater.DataSource = list; this.SearchRepeater.DataBind();
大致 思路就是 這樣子 不錯 這兩坨代碼 太難看了 因而 我基於這2段 代碼 封裝下了因而有了 LuceneHelpercode
使用方法:orm
以上爲2.9.2.2 版本對象
通過幾天的摸索,發現 3.0.3 改變不是很大...因而寫了一份Lucene3.0.3的Helperblog
代碼:
使用方式 通上個版本 只是修改 版本的兼容性