Lucene.net常见功能实现知识汇总
在開發(fā)SearchEasy Site SearchEngine(搜易站內(nèi)搜索引擎)的時候,經(jīng)常會遇到一些搜索引擎的常見功能如何實(shí)現(xiàn)的問題,比如實(shí)現(xiàn)相關(guān)度百分比顯示?如何實(shí)現(xiàn)在結(jié)果中搜索等等諸如此類常見的問題,本文總結(jié)我在開發(fā)SearchEasy Site SearchEngine(搜易站內(nèi)搜索引擎)過程中遇到的問題,整理分享給需要的園友們:
問:Lucene.net的搜索結(jié)果的百分比相關(guān)度值是如何實(shí)現(xiàn)的?
答:
??? Hits result = searcher.Search(q);
??? float score = result.Score(n) ;//n為查詢結(jié)果文擋序號,返回的是一個<=1f的float的值,表示為百分比字符串:score.ToString("0%") ;
問:如何通過編程的方式改變Lucene.net的鎖文件存放的位置?
答:
??? Lucene.net的鎖文件默認(rèn)是存放系統(tǒng)臨時文件夾,可以通過下面的語句來修改
??? System.Configuration.ConfigurationSettings.AppSettings.Add("Lucene.Net.lockDir", "your new lockDir") ;
??? 通過FSDirectory.LOCK_DIR可以獲得鎖文件存放的位置(文件夾)
???
問:如何判斷某個索引庫被鎖定,如何強(qiáng)制解除鎖定?
答:
?? 具體實(shí)現(xiàn),可以參看Lucene.Net.Store.FSDirectory的Obtain()(判斷是否鎖定)方法和Release()方法(解除鎖定)??
?? 備注:還有一個IsLocked方法也可以參考下。
??
問:如何實(shí)現(xiàn)多個索引的聯(lián)合搜索 ?
答:
?? IndexSearcher[] searchers = new IndexSearcher[2];
?? searchers[0] = new IndexSearcher(dir1) ;
?? searchers[1] = new IndexSearcher(dir2) ;
??
?? MultiSearcher searcher = new MultiSearcher(searchers) ;//或ParallelMultiSearcher searcher = new ParallelMultiSearcher(searchers) ;
?? searcher.Search(query) ;
??
?? ParallelMultiSearcher與MultiSearcher的區(qū)別,前者為每一個索引單獨(dú)開一個線程,以多線程的方式同步搜索;后者是逐個依次搜索,然后合并;
?? 所以ParallelMultiSearcher的搜索總用時是最慢的哪個索引的搜索用時,MultiSearcher則是搜索總用時等于所有索引搜索用時之和;
??
問:如何實(shí)現(xiàn)在結(jié)果中搜索 ?
答:
??? *方法一,使用CachingWrapperFilter。不能實(shí)現(xiàn)無限級的“在結(jié)果中搜索”:
??? QueryParser parser = new QueryParser("content", analyzer);
???
??? Query currentQuery = parser.Parse(currentKeyword) ;
?Query oldQuery = parser.Parse(oldKeyword) ;
?QueryFilter oldFilter = new QueryFilter(oldQuery) ;
?CachingWrapperFilter filter = new CachingWrapperFilter(oldFilter) ;
?
?IndexSearcher searcher = new IndexSearcher(indexDir);
?
?Hits result = searcher.Search(currentQuery, filter) ;
?
?*方法二,將多個查詢關(guān)鍵詞做AND的BooleanQuery或者直接構(gòu)造查詢Sytax傳給QueryParser,都可以實(shí)現(xiàn)無限級的“在結(jié)果中搜索“。
?
問:BooleanQuery.maxClauseCount的含義 ?
答:
??? 添加到BooleanQuery的最多的Query數(shù),默認(rèn)是1024。超過該值會拋出TooManyClauses異常,可以通過BooleanQuery.SetMaxClauseCount(int)設(shè)置新的值。
??? 備注:含義解釋未明確。
問:如何判斷一個索引庫是否存在?
答:
?? string indexPath = "your indexPath" ; //索引所在目錄
?? if (System.IO.Directory.Exists(indexPath) && System.IO.File.Exists(Path.Combine(indexPath,"segments")
????? //存在
?? else
????? //不存在
??
?? 當(dāng)然有更直接的方法
?? if (Lucene.Net.Index.IndexReader.IndexExists(indexPath))
???? //存在
?? else
???? //不存在
????
?? Lucene.Net.Index.IndexReader.IndexExists方法內(nèi)部的實(shí)現(xiàn)方式和上面的類似,當(dāng)然直接用Lucene.Net.Index.IndexReader.IndexExists更可靠些。
?
轉(zhuǎn)載于:https://www.cnblogs.com/kwklover/archive/2012/11/10/2764230.html
總結(jié)
以上是生活随笔為你收集整理的Lucene.net常见功能实现知识汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gvim配置及相关插件安装(过程详细,附
- 下一篇: (转)无边框窗口实现拖垃效果