【Lucene4.8教程之三】搜索
1、關(guān)鍵類
Lucene的搜索過程中涉及的主要類有以下幾個(gè):
(1)IndexSearcher:執(zhí)行search()方法的類
(2)IndexReader:對索引文件進(jìn)行讀操作,并為IndexSearcher提供搜索接口
(3)Query及其子類:查詢對象,search()方法的重要參數(shù)
(4)QueryParser:根據(jù)用戶輸入的搜索詞匯生成Query對象。
(5)TopDocs:search()方法返回的前n個(gè)文檔
(6)ScoreDocs:提供TopDocs中搜索結(jié)果的訪問接口
2、搜索的關(guān)鍵步驟
(1)創(chuàng)建IndexReader
(2)使用IndexReader創(chuàng)建IndexSearcher
(3)根據(jù)搜索關(guān)鍵字,使用QueryParser生成Query對象
(4)以Query作為參數(shù)調(diào)用IndexSearcher.search(),執(zhí)行搜索
(5)以TopDocs以及ScoreDocs遍歷結(jié)果并處理
示例代碼如下:
//(1)創(chuàng)建IndexReader Directory indexDir2 = FSDirectory.open(indexDir); IndexReader ir = DirectoryReader.open(indexDir2); //(2)使用IndexReader創(chuàng)建IndexSearcher IndexSearcher searcher = new IndexSearcher(ir); //(3)根據(jù)搜索關(guān)鍵字,使用QueryParser生成Query對象 QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new SimpleAnalyzer(Version.LUCENE_48)); Query query = null; try {query = parser.parse(term);} catch (ParseException e) {e.printStackTrace();} //(4)以Query作為參數(shù)調(diào)用IndexSearcher.search(),執(zhí)行搜索 TopDocs docs = searcher.search(query, 30); //(5)以TopDocs以及ScoreDocs遍歷結(jié)果并處理 ScoreDoc[] hits = docs.scoreDocs; System.out.println(hits.length); for (ScoreDoc hit : hits) {System.out.println("doc: " + hit.doc + " score: " + hit.score);}3、關(guān)于IndexReader
(1)IndexReader未提供構(gòu)造函數(shù),因此需要通過DirectoryReader.open()方法來創(chuàng)建一個(gè)IndexReader。
(2)創(chuàng)建一個(gè)IndexReader需要較大的系統(tǒng)開銷,因此最好在所有搜索期間都重復(fù)使用一個(gè)IndexReader,只有在必要的時(shí)候才建議打開新的IndexReader。
(3)在創(chuàng)建IndexReader時(shí),它會(huì)搜索已有的索引快照,如果你需要搜索索引中的變更信息,那么必須打開一個(gè)新的reader。所幸的是IndexReader.reopen方法是一個(gè)獲取新IndexReader的有效方法,能在耗費(fèi)較少系統(tǒng)資源的情況下使用當(dāng)前reader來獲取索引中所有的變更信息。【新版本中已廢棄,待確認(rèn)替代方法】
4、關(guān)于QueryParser與Query的子類
對于一個(gè)搜索而言,其核心語句為:
searcher.search(query, 10);此時(shí),其最重要的參數(shù)為一個(gè)Qeury對象。構(gòu)造一個(gè)Query對象有2種方法:【均以在contents域搜索java關(guān)鍵詞為例】(1)使用Query的子類,如BooleanQuery, ConstantScoreQuery, DisjunctionMaxQuery, FilteredQuery, MatchAllDocsQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, SpanQuery, TermQuery,直接實(shí)例化一個(gè)對外:
searcher.search( new TermQuery(new Term("contents","java")), 10);以下語句結(jié)構(gòu)更為清晰
Term term= new Term("contents","java"); TermQuery tq = new TermQuery(term); searcher.search(tq , 10); 此外,即為在contents域中搜索包括java的文檔。(2)使用QueryParser的parse()方法,對所傳入的搜索關(guān)鍵詞匯進(jìn)行解釋,并返回query對象。
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new SimpleAnalyzer(Version.LUCENE_48)); Query query = null; try {query = parser.parse("java"); } catch (ParseException e) {e.printStackTrace(); } TopDocs docs = searcher.search(query, 10);以上語句創(chuàng)建一個(gè)QueryParser,其默認(rèn)搜索域?yàn)閏ontents,然后將搜索詞匯轉(zhuǎn)化為Query對象。如果指定QueryParser的默認(rèn)搜索域?yàn)槿?#xff1f;如何指定一個(gè)Query的搜索域?
關(guān)于QueryParser與Query子類的更詳細(xì)內(nèi)容,請參見
【Lucene4.8教程之六】QueryParser與Query子類:如何生成Query對象?http://blog.csdn.net/jediael_lu/article/details/33288793
總結(jié)
以上是生活随笔為你收集整理的【Lucene4.8教程之三】搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Lucene4.8教程之一】使用Luc
- 下一篇: 【Lucene4.8教程之六】Query