各類查詢
方式一:使用QueryParser與查詢語法。(會使用分詞器)java
MultiFieldQueryParser
查詢字符串 ------------------------> Query對象apache
例如:
上海 AND 天氣
上海 OR 天氣
上海新聞 AND site:news.163.com
...dom
方式二:
直接建立Query的實例(子類的),不會使用分詞器
new TermQuery(..);
new BooleanQuery(..);工具
package cn.itcast.i_query; import java.util.ArrayList; import java.util.List; import org.apache.lucene.document.Document; import org.apache.lucene.index.Term; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.FuzzyQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.WildcardQuery; import org.apache.lucene.search.BooleanClause.Occur; import org.junit.Test; import cn.itcast._domain.Article; import cn.itcast._util.ArticleDocumentUtils; import cn.itcast._util.LuceneUtils; public class TestApp { // 關鍵詞查詢 @Test public void testTermQuery() { // 對應的查詢字符串爲:title:lucene TermQuery query = new TermQuery(new Term("title", "lucene")); searchAndShowResult(query); } // 通配符查詢 // ? 表示一個任意字符 // * 表示0或多個任意字符 @Test public void testWildcardQuery() { // 對應的查詢字符串爲:title:lu*n? // WildcardQuery query = new WildcardQuery(new Term("title", "lu*n?")); // 對應的查詢字符串爲:content:互?網 WildcardQuery query = new WildcardQuery(new Term("content", "互?網")); searchAndShowResult(query); } // 查詢全部 @Test public void testMatchAllDocsQuery() { // 對應的查詢字符串爲:*:* MatchAllDocsQuery query = new MatchAllDocsQuery(); searchAndShowResult(query); } // 模糊查詢 @Test public void testFuzzyQuery() { // 對應的查詢字符串爲:title:lucenX~0.9 // 第二個參數是最小類似度,表示有多少正確的就顯示出來,好比0.9表示有90%正確的字符就會顯示出來。 FuzzyQuery query = new FuzzyQuery(new Term("title", "lucenX"), 0.8F); searchAndShowResult(query); } // 範圍查詢 @Test public void testNumericRangeQuery() { // 對應的查詢字符串爲:id:[5 TO 15] // NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, true); // 對應的查詢字符串爲:id:{5 TO 15} // NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, false, false); // 對應的查詢字符串爲:id:[5 TO 15} NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, false); searchAndShowResult(query); } // 布爾查詢 @Test public void testBooleanQuery() { BooleanQuery booleanQuery = new BooleanQuery(); // booleanQuery.add(query, Occur.MUST); // 必須知足 // booleanQuery.add(query, Occur.SHOULD); // 多個SHOULD一塊兒用表示OR的關係 // booleanQuery.add(query, Occur.MUST_NOT); // 非 Query query1 = new TermQuery(new Term("title", "lucene")); Query query2 = NumericRangeQuery.newIntRange("id", 5, 15, false, true); // // 對應的查詢字符串爲:+title:lucene +id:{5 TO 15] // // 對應的查詢字符串爲(大寫的AND):title:lucene AND id:{5 TO 15] // booleanQuery.add(query1, Occur.MUST); // booleanQuery.add(query2, Occur.MUST); // 對應的查詢字符串爲:title:lucene id:{5 TO 15] // 對應的查詢字符串爲:title:lucene OR id:{5 TO 15] // booleanQuery.add(query1, Occur.SHOULD); // booleanQuery.add(query2, Occur.SHOULD); // 對應的查詢字符串爲:+title:lucene -id:{5 TO 15] // 對應的查詢字符串爲:title:lucene (NOT id:{5 TO 15] ) booleanQuery.add(query1, Occur.MUST); booleanQuery.add(query2, Occur.MUST_NOT); searchAndShowResult(booleanQuery); } /** * 測試搜索的工具方法 * * @param query */ private void searchAndShowResult(Query query) { try { // // 準備查詢條件 // String queryString = "content:lucene"; // // 1,把查詢字符串轉爲Query對象(從title和content中查詢) // QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "title", "content" }, LuceneUtils.getAnalyzer()); // Query query = queryParser.parse(queryString); System.out.println("---> // 對應的查詢字符串爲:" + query + "\n"); // 2,執行查詢,獲得中間結果 IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory()); // 指定所用的索引庫 TopDocs topDocs = indexSearcher.search(query, 100); // 最多返回前n條結果 // 3,處理結果 List<Article> list = new ArrayList<Article>(); for (int i = 0; i < topDocs.scoreDocs.length; i++) { // 根據編號拿到Document數據 int docId = topDocs.scoreDocs[i].doc; // Document的內部編號 Document doc = indexSearcher.doc(docId); // 把Document轉爲Article Article article = ArticleDocumentUtils.documentToArticle(doc); list.add(article); } indexSearcher.close(); // 顯示結果 System.out.println("總結果數:" + list.size()); for (Article a : list) { System.out.println("------------------------------"); System.out.println("id = " + a.getId()); System.out.println("title = " + a.getTitle()); System.out.println("content = " + a.getContent()); } } catch (Exception e) { throw new RuntimeException(e); } } }