一、概述
1、對於一個搜尋而言,其核心語句為:
searcher.search(query, 10);
此時,其最重要的參數為一個Qeury對象。構造一個Query對象有2種方法:
(1)使用Query的子類建立一個對象。
(2)使用QueryParser.parse()建立一個對象。
常用的用於執行個體化一個對象的Query子類有以下13個:
TermQuery
BooleanQuery
WildcardQuery
PhraseQuery
PrefixQuery
MultiPhraseQuery
FuzzyQuery
RegexpQuery
TermRangeQuery
NumericRangeQuery
ConstantScoreQuery
DisjunctionMaxQuery
MatchAllDocsQuery
2、快速入門
【均以在contents域搜尋java關鍵詞為例】
(1)使用Query的子類,,直接執行個體化一個對外:
searcher.search( new TermQuery(new Term("contents","java")), 10);
以下語句結構更為清晰
Term term= new Term("contents","java");TermQuery tq = new TermQuery(term);searcher.search(tq , 10);
此外,即為在contents域中搜尋包括java的文檔。
(2)使用QueryParser的parse()方法,對所傳入的搜尋關鍵詞彙進行解釋,並返回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);以上語句建立一個QueryParser,其預設搜尋域為contents,然後將搜尋字詞匯轉化為Query對象。
如果指定QueryParser的預設搜尋域為全部。如何指定一個Query的搜尋域。
二、TermQuery
1、建立方式
上述快速入門中使用的就是TermQuery。
2、適用範圍
(1)直接使用TermQuery,不對搜尋字詞作任何的分析,包括大小寫都不作轉換,而使用QueryParser,則可以根據Analyzer的類型作分析。
(2)TermQuery適合使用於完全符合的搜尋,如搜尋id號,二維碼,姓名等。
三、BooleanQuery
1、建立方式
(1)使用BooleanQuery
多個搜尋條件組成BooleanQuey對象,以後補充例子。
(2)使用QueryParser
對於一個QueryParser,若其未指定是何種邏輯操作,則其將預設為Operator.OR。因此,若搜尋 java web,則其會認為java OR web。
而對於中文,使用StandartAnalyzer分析器時,會將每個字作為一個詞彙。如搜尋“學習”,則搜尋“學 OR 習”。
因此,為指定搜尋“學習”或者'java web"等,必須顯示指定邏輯操作為Operator.AND。
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new StandardAnalyzer(Version.LUCENE_48));parser.setDefaultOperator(Operator.AND);Query query = parser.parse(term);
2、適用範圍
(1)BooleanQuery方式,由於需要將搜尋內容產生多個Query對象,再進行邏輯組合,因此,只適用於根據多個搜尋條件進行搜尋的情形。如:
在上述頁面選擇多個篩選條件,然後,每個篩選條件產生一個Query對象,再將各個Query對象進行邏輯組合。
(2)QueryParser方式,適用於單一搜尋方塊,使用自然語言進行搜尋的情形。如google,百度等搜尋方塊。
四、PhraseQuery
1、簡單說明
在使用雙引號將搜尋索引鍵括起來,則將搜尋關鍵詞作為一個整體的短語進行搜尋。如:
前者只有534個返回結果,後者有200多萬返回結果。對於前者,將會搜尋java 和sunshine之間的距離少於一個特定的slop值的文檔。