Lucene筆記11-Lucene的搜尋-基於QueryParser的搜尋
阿新 • • 發佈:2018-11-04
一、QueryParser查詢
QueryParser查詢功能是非常強大的,幾乎可以涵蓋前面所有的查詢,下面是方法體,它將query作為引數傳遞進來。
// 表示式查詢 public void searchByQueryParser(Query query, int number) { IndexSearcher indexSearcher = getIndexSearcher(); try { TopDocs topDocs = indexSearcher.search(query, number); System.out.println("一共查詢到:" + topDocs.totalHits); for (ScoreDoc scoreDoc : topDocs.scoreDocs) { Document document = indexSearcher.doc(scoreDoc.doc); System.out.println(document.get("id") + " " + document.get("name") + " " + document.get("email")); } } catch (IOException e) { e.printStackTrace(); } finally { if (indexSearcher != null) { try { indexSearcher.close(); } catch (IOException e) { e.printStackTrace(); } } } }
二、測試案例
將query和number傳入searchByQueryParser()方法就可以查詢了。
// 預設搜尋域為content QueryParser queryParser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35)); // 將預設操作符為and,預設是or queryParser.setDefaultOperator(QueryParser.Operator.AND); // 搜尋content中包含basketball或者football的 Query query = queryParser.parse("basketball football"); // 改變預設搜尋域查詢 Query query = queryParser.parse("name:zhangsan"); // 改變預設搜尋域且使用萬用字元查詢 Query query = queryParser.parse("name:z*"); // 查詢name中以i結尾的,預設是不允許查詢*開頭的,因為會影響效率,不過我們可以手動開啟許可權 queryParser.setAllowLeadingWildcard(true); Query query = queryParser.parse("name:*i"); // 查詢content(預設搜尋域)有football的,並且name不是lisi的,-和+後面必須有空格 Query query = queryParser.parse("- name:lisi + football"); // 查詢id是1到3的,包括端點值,這裡的TO必須是大寫的,改成to會報錯 Query query = queryParser.parse("id:[1 TO 3]"); // 查詢id是1到3的,不包括端點值,這裡的TO必須是大寫的,改成to會報錯 Query query = queryParser.parse("id:{1 TO 3}"); // 完全匹配I like football的 Query query = queryParser.parse("\"I like football\""); // 匹配I * football的,並且單詞間距為1的 Query query = queryParser.parse("\"I like football\"~1"); // 加一個~構成模糊搜尋 Query query = queryParser.parse("name:lixi~");