小菜学习Lucene.Net(更新3.0.3版本使用)
花了兩天的時(shí)間研究了下Lucene.Net 發(fā)現(xiàn)確實(shí)挺好玩.... 最新版本是3.0.3 (最后更新時(shí)間2012-10)
可惜3.0.3版本的Lucene.net無(wú)法和盤(pán)古分詞 (最新版為2.3.1.0 最后更新時(shí)間 2010-10)一起使用.....因?yàn)楸P(pán)古分詞 基于2.9.x.x版本 寫(xiě)的 ,在 3.0.3中很多 接口 和 類名 發(fā)生了 變化..(當(dāng)然 網(wǎng)上 也有解決方案 :基于新的接口 重新 編譯 盤(pán)古分詞)
今天主要用的是 Lucene.Net 2.9.2.2 與盤(pán)古分詞 2.3.0.0版本.
主要功能就是 創(chuàng)建索引,和搜索 下面貼出 2段代碼
? ? ? 創(chuàng)建索引:
?View Code
? ? 搜索代碼:
string indexPath = @"C:\lucenedir";//最好將該項(xiàng)放在配置文件中。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))//將用戶輸入的搜索內(nèi)容進(jìn)行了盤(pán)古分詞、 {query = new TermQuery(new Term("msg", word));//query.Add(new Term("msg", word)); queryMsg.Add(query, BooleanClause.Occur.SHOULD);}//query.SetSlop(100);//多個(gè)查詢條件的詞之間的最大距離.在文章中相隔太遠(yuǎn) 也就無(wú)意義.(例如 “大學(xué)生”這個(gè)查詢條件和"簡(jiǎn)歷"這個(gè)查詢條件之間如果間隔的詞太多也就沒(méi)有意義了。)//TopScoreDocCollector是盛放查詢結(jié)果的容器TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);searcher.Search(queryMsg, null, collector);//根據(jù)query查詢條件進(jìn)行查詢,查詢結(jié)果放入collector容器ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;//得到所有查詢結(jié)果中的文檔,GetTotalHits():表示總條數(shù) TopDocs(300, 20);//表示得到300(從300開(kāi)始),到320(結(jié)束)的文檔內(nèi)容. //可以用來(lái)實(shí)現(xiàn)分頁(yè)功能 List<SearchResult> list = new List<SearchResult>();for (int i = 0; i < docs.Length; i++){////搜索ScoreDoc[]只能獲得文檔的id,這樣不會(huì)把查詢結(jié)果的Document一次性加載到內(nèi)存中。降低了內(nèi)存壓力,需要獲得文檔的詳細(xì)內(nèi)容的時(shí)候通過(guò)searcher.Doc來(lái)根據(jù)文檔id來(lái)獲得文檔的詳細(xì)內(nèi)容對(duì)象Document.int docId = docs[i].doc;//得到查詢結(jié)果文檔的id(Lucene內(nèi)部分配的id)Document doc = searcher.Doc(docId);//找到文檔id對(duì)應(yīng)的文檔詳細(xì)信息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();大體 思路就是 這樣子 不錯(cuò) 這兩坨代碼 太難看了 于是 我基于這2段 代碼 封裝下了于是有了 ?LuceneHelper
?View Code使用方法:
?View Code?以上為2.9.2.2 版本
經(jīng)過(guò)幾天的摸索,發(fā)現(xiàn) 3.0.3 改變不是很大...于是寫(xiě)了一份Lucene3.0.3的Helper
代碼:
?View Code使用方式 通上個(gè)版本 只是修改 版本的兼容性
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的小菜学习Lucene.Net(更新3.0.3版本使用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 动软发布微信营销服务系统,微信商城系统!
- 下一篇: Port Forwarding Por