Lucene:QueryParser

做爲luceneQuery工具,QueryParser倒是最重要的一個。簡單的說,QueryParser可以根據用戶的輸入來進行解析,自動構建合適的Query對象。下面簡單總結一下它的實現:html

目錄web

 

 

一、用戶輸入(詞條的定義)數組


當用戶輸入要查詢的關鍵字串後,QueryParser首先會對其進行解析,而這種解析是以詞條爲基礎的。而詞條和詞條之間呢,則是用空格分開的。多線程

 

二、QueryParser的初始化工具


邏輯運算符「AND,OR,NOT」ui

複製代碼
 1 String field = 「bookname」;//設置一個默認的field
 2 String queryStr = 「Persist Google」;//用戶輸入的關鍵字
 3  
 4 
 5 //new了一個QueryParser,而且傳進去兩個參數。
 6 //第一個參數是默認要檢索的field;(由於在用戶沒有指定field時,lucene會在默認的field中檢索)
 7 //第二個參數是用到的分析器;(注意:這裏的分析器必定要使用創建索引時的分析器,不然所分詞條與索引中的內容不一致,最終致使錯誤出現!)
 8 
 9 QueryParser parser = new QueryParser(field,new StandardAnalyzer());
10  
11 Query q = parser.parser(queryStr);//執行QueryParser的parser方法
複製代碼

在這裏,咱們(用戶)所輸入的「Persist Google」被QueryParser分析成了「OR」的關係,即檢索有「Persist」或者「Google」的文檔。這並不是咱們的意願,咱們要查的是同時含有「Persist」和「Google」文檔。那麼咱們嘗試改變一下QueryParser默認的布爾邏輯。this

1 //上面的代碼中只須要加上下面語句便可實現。
2 parser.setDefaultOperator(QueryParser.AND_OPERATOR);

或者,將用戶輸入的關鍵字串「Persist Google」改成「Persist AND Google」也能夠實現上述要求。spa

 

三、短語和QueryParser線程


咱們輸入幾個詞,QueryParser就會把它解成幾個詞條。那麼當咱們輸入一句話的時候,(如:Rome is not built in one day)此時這句話有七個詞,咱們並不想把它分紅幾個詞來查詢,怎麼辦呢?固然,lucene的開發者早已經想到了這點,也很人性化的解決了這一個問題,他們說:「給這句話加個引號吧!」。code

1 //咱們則只須要將代碼
2 String queryStr = 「Rome is not built in one day」;
3 
4 //改成以下代碼便可。
5 String queryStr = 「/"Rome is not built in one day/」」;


四、QueryParser的模糊匹配查詢


FuzzyQuery(即模糊匹配)查詢。它的用法與其餘Query對象倒是大同小異的。不一樣的是,FuzzyQuery有一個類似度的概念。咱們不須要深入理解,只須要知道它會去匹配和輸入詞條類似的其餘詞條便可。

1  //如:FuzzyQuery默認的類似度爲0.5
2 Term t = new Term(「bookname」, 「work」);
3 FuzzyQuery query = new FuzzyQuery(t);

用QueryParser的概念對輸入關鍵字進行分析,咱們只須要給輸入的關鍵字加一個符號。如:work~0.2,即把work類似度0.5改成了0.2

 

五、通配符與QueryParser


 

複製代碼
1 //在以前的Google中提到的通配符原理亦是如此。
2 Term t = new Term(「bookname」, 「wor?」);
3 WildcardQuery q = new WildcardQuery(t);
4 
5 //wor?能夠被QueryParser識別,表示前三個字母爲wor的詞條。
6 //即有多是word,work...
複製代碼

 

六、QueryParser指定Field查詢


 

1 //此時回去檢索發佈時間爲2010-12-5的全部文檔,而且bookname爲work
2 String queryStr = 「work publishdate:2010-12-5」;
3 QueryParser parser = new QueryParser(「bookname」,new StandardAnalyzer());
4 Parser.setDefaultOperator(QueryParser.AND_OPERATOR);
5 Query query = parser.parser(queryStr);

 

七、QueryParser的範圍查找(RangeQuery):TO


 

1 //找出發佈日期從2010-12-01到2010-12-05的全部文檔
2 String queryStr = 「[2010-12-1 TO 2010-12-5]」;
3 QueryParser parser = new QueryParser(「bookname」,new StandardAnalyzer());
4 Parser.setDefaultOperator(QueryParser.AND_OPERATOR);
5 Query query = parser.parser(queryStr);

 

八、QueryParser的多域查詢MultiFieldQueryParser


 

複製代碼
1 //如查詢多個域, title和content, 要定義一個包含多域的數組
2 String[] fields = {"title","content"};        
3 String queryStr=「計算機」
4 QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36, fields, new StandardAnalyzer());        
5 Query query = queryParser.parse(queryStr);   
複製代碼

 

在Lucene中,還有不少搜索方式,如:多索引搜索MultiSearcher,多線程搜索ParalellMultiSearcher等。用法都基本相似,原理也大同小異,是比較好理解的。

值得關注的是多線程搜索ParalellMultiSearcher,由於若只有單個線程的話,多訪問時,總要等上個線程結束,這樣反饋時間是很慢的,這裏就須要多線程搜索來提升效率。

以上所提到的全部方法均可以互相結合或者嵌套使用,對各類口味的用戶都能給予知足,這也正是Lucene的靈活性。

本站公眾號
   歡迎關注本站公眾號,獲取更多信息