做爲lucene的Query工具,QueryParser倒是最重要的一個。簡單的說,QueryParser可以根據用戶的輸入來進行解析,自動構建合適的Query對象。下面簡單總結一下它的實現:html
目錄web
當用戶輸入要查詢的關鍵字串後,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就會把它解成幾個詞條。那麼當咱們輸入一句話的時候,(如: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/」」;
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
1 //在以前的Google中提到的通配符原理亦是如此。 2 Term t = new Term(「bookname」, 「wor?」); 3 WildcardQuery q = new WildcardQuery(t); 4 5 //wor?能夠被QueryParser識別,表示前三個字母爲wor的詞條。 6 //即有多是word,work...
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的靈活性。