Lucene:QueryParser
作為lucene的Query工具,QueryParser卻是最重要的一個。簡單的說,QueryParser能夠根據(jù)用戶的輸入來進行解析,自動構建合適的Query對象。下面簡單總結一下它的實現(xiàn):
目錄
- 用戶輸入
- QueryParser的初始化
- 短語和QueryParser?
- QueryParser的模糊匹配查詢
- 通配符與QueryParser
- QueryParser指定Field查詢
- QueryParser的范圍RangeQuery查詢
- QueryParser的多域MultiFieldQueryParser查詢
?
?
1、用戶輸入(詞條的定義)
當用戶輸入要查詢的關鍵字串后,QueryParser首先會對其進行解析,而這種解析是以詞條為基礎的。而詞條和詞條之間呢,則是用空格分開的。
?
2、QueryParser的初始化
邏輯運算符“AND,OR,NOT”
1 String field = “bookname”;//設置一個默認的field 2 String queryStr = “Persist Google”;//用戶輸入的關鍵字 3 4 5 //new了一個QueryParser,并且傳進去兩個參數(shù)。 6 //第一個參數(shù)是默認要檢索的field;(因為在用戶沒有指定field時,lucene會在默認的field中檢索) 7 //第二個參數(shù)是用到的分析器;(注意:這里的分析器一定要使用建立索引時的分析器,否則所分詞條與索引中的內(nèi)容不一致,最終導致錯誤出現(xiàn)!) 8 9 QueryParser parser = new QueryParser(field,new StandardAnalyzer()); 10 11 Query q = parser.parser(queryStr);//執(zhí)行QueryParser的parser方法在這里,我們(用戶)所輸入的“Persist Google”被QueryParser分析成了“OR”的關系,即檢索有“Persist”或者“Google”的文檔。這并非我們的意愿,我們要查的是同時含有“Persist”和“Google”文檔。那么我們嘗試改變一下QueryParser默認的布爾邏輯。
1 //上面的代碼中只需要加上下面語句即可實現(xiàn)。 2 parser.setDefaultOperator(QueryParser.AND_OPERATOR);或者,將用戶輸入的關鍵字串“Persist Google”改為“Persist AND Google”也可以實現(xiàn)上述要求。
?
3、短語和QueryParser
我們輸入幾個詞,QueryParser就會把它解成幾個詞條。那么當我們輸入一句話的時候,(如:Rome is not built in one day)此時這句話有七個詞,我們并不想把它分成幾個詞來查詢,怎么辦呢?當然,lucene的開發(fā)者早已經(jīng)想到了這點,也很人性化的解決了這一個問題,他們說:“給這句話加個引號吧!”。
1 //我們則只需要將代碼 2 String queryStr = “Rome is not built in one day”; 3 4 //改為如下代碼即可。 5 String queryStr = “/"Rome is not built in one day/””;
4、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
?
5、通配符與QueryParser
?
1 //在之前的Google中提到的通配符原理亦是如此。 2 Term t = new Term(“bookname”, “wor?”); 3 WildcardQuery q = new WildcardQuery(t); 4 5 //wor?可以被QueryParser識別,表示前三個字母為wor的詞條。 6 //即有可能是word,work...?
6、QueryParser指定Field查詢
?
1 //此時回去檢索發(fā)布時間為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);?
7、QueryParser的范圍查找(RangeQuery):TO
?
1 //找出發(fā)布日期從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);?
8、QueryParser的多域查詢MultiFieldQueryParser
?
1 //如查詢多個域, title和content, 要定義一個包含多域的數(shù)組 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的靈活性。
轉(zhuǎn)載于:https://www.cnblogs.com/zhwl/p/3495133.html
總結
以上是生活随笔為你收集整理的Lucene:QueryParser的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 报表导航
- 下一篇: 58同城买二手电脑的感想