lucene 查詢的使用


各種查詢
方式一:使用QueryParser與查詢語法。(會使用分詞器)

MultiFieldQueryParser
查詢字符串 ------------------------> Query對象

例如:
上海 AND 天氣
上海 OR 天氣
上海新聞 AND site:news.163.com
...

方式二:
直接創建Query的實例(子類的),不會使用分詞器
new TermQuery(..);
new BooleanQuery(..);

 

 

  1 package cn.itcast.i_query;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import org.apache.lucene.document.Document;
  7 import org.apache.lucene.index.Term;
  8 import org.apache.lucene.search.BooleanQuery;
  9 import org.apache.lucene.search.FuzzyQuery;
 10 import org.apache.lucene.search.IndexSearcher;
 11 import org.apache.lucene.search.MatchAllDocsQuery;
 12 import org.apache.lucene.search.NumericRangeQuery;
 13 import org.apache.lucene.search.Query;
 14 import org.apache.lucene.search.TermQuery;
 15 import org.apache.lucene.search.TopDocs;
 16 import org.apache.lucene.search.WildcardQuery;
 17 import org.apache.lucene.search.BooleanClause.Occur;
 18 import org.junit.Test;
 19 
 20 import cn.itcast._domain.Article;
 21 import cn.itcast._util.ArticleDocumentUtils;
 22 import cn.itcast._util.LuceneUtils;
 23 
 24 public class TestApp {
 25 
 26     // 關鍵詞查詢
 27     @Test
 28     public void testTermQuery() {
 29         // 對應的查詢字符串為:title:lucene
 30         TermQuery query = new TermQuery(new Term("title", "lucene"));
 31         searchAndShowResult(query);
 32     }
 33 
 34     // 通配符查詢
 35     // ? 表示一個任意字符
 36     // * 表示0或多個任意字符
 37     @Test
 38     public void testWildcardQuery() {
 39         // 對應的查詢字符串為:title:lu*n?
 40         // WildcardQuery query = new WildcardQuery(new Term("title", "lu*n?"));
 41 
 42         // 對應的查詢字符串為:content:互?網
 43         WildcardQuery query = new WildcardQuery(new Term("content", "互?網"));
 44         searchAndShowResult(query);
 45     }
 46 
 47     // 查詢所有
 48     @Test
 49     public void testMatchAllDocsQuery() {
 50         // 對應的查詢字符串為:*:*
 51         MatchAllDocsQuery query = new MatchAllDocsQuery();
 52         searchAndShowResult(query);
 53     }
 54 
 55     // 模糊查詢
 56     @Test
 57     public void testFuzzyQuery() {
 58         // 對應的查詢字符串為:title:lucenX~0.9
 59         // 第二個參數是最小相似度,表示有多少正確的就顯示出來,比如0.9表示有90%正確的字符就會顯示出來。
 60         FuzzyQuery query = new FuzzyQuery(new Term("title", "lucenX"), 0.8F);
 61         searchAndShowResult(query);
 62     }
 63 
 64     // 范圍查詢
 65     @Test
 66     public void testNumericRangeQuery() {
 67         // 對應的查詢字符串為:id:[5 TO 15]
 68         // NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, true);
 69 
 70         // 對應的查詢字符串為:id:{5 TO 15}
 71         // NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, false, false);
 72 
 73         // 對應的查詢字符串為:id:[5 TO 15}
 74         NumericRangeQuery query = NumericRangeQuery.newIntRange("id", 5, 15, true, false);
 75 
 76         searchAndShowResult(query);
 77     }
 78 
 79     // 布爾查詢
 80     @Test
 81     public void testBooleanQuery() {
 82         BooleanQuery booleanQuery = new BooleanQuery();
 83         // booleanQuery.add(query, Occur.MUST); // 必須滿足
 84         // booleanQuery.add(query, Occur.SHOULD); // 多個SHOULD一起用表示OR的關系
 85         // booleanQuery.add(query, Occur.MUST_NOT); //
 86 
 87         Query query1 = new TermQuery(new Term("title", "lucene"));
 88         Query query2 = NumericRangeQuery.newIntRange("id", 5, 15, false, true);
 89 
 90         // // 對應的查詢字符串為:+title:lucene +id:{5 TO 15]
 91         // // 對應的查詢字符串為(大寫的AND):title:lucene AND id:{5 TO 15]
 92         // booleanQuery.add(query1, Occur.MUST);
 93         // booleanQuery.add(query2, Occur.MUST);
 94 
 95         // 對應的查詢字符串為:title:lucene id:{5 TO 15]
 96         // 對應的查詢字符串為:title:lucene OR id:{5 TO 15]
 97         // booleanQuery.add(query1, Occur.SHOULD);
 98         // booleanQuery.add(query2, Occur.SHOULD);
 99 
100         // 對應的查詢字符串為:+title:lucene -id:{5 TO 15]
101         // 對應的查詢字符串為:title:lucene (NOT id:{5 TO 15] )
102         booleanQuery.add(query1, Occur.MUST);
103         booleanQuery.add(query2, Occur.MUST_NOT);
104 
105         searchAndShowResult(booleanQuery);
106     }
107 
108     /**
109      * 測試搜索的工具方法
110      * 
111      * @param query
112      */
113     private void searchAndShowResult(Query query) {
114         try {
115             // // 准備查詢條件
116             // String queryString = "content:lucene";
117             // // 1,把查詢字符串轉為Query對象(從title和content中查詢)
118             // QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "title", "content" }, LuceneUtils.getAnalyzer());
119             // Query query = queryParser.parse(queryString);
120 
121             System.out.println("--->  // 對應的查詢字符串為:" + query + "\n");
122 
123             // 2,執行查詢,得到中間結果
124             IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory()); // 指定所用的索引庫
125             TopDocs topDocs = indexSearcher.search(query, 100); // 最多返回前n條結果
126 
127             // 3,處理結果
128             List<Article> list = new ArrayList<Article>();
129             for (int i = 0; i < topDocs.scoreDocs.length; i++) {
130                 // 根據編號拿到Document數據
131                 int docId = topDocs.scoreDocs[i].doc; // Document的內部編號
132                 Document doc = indexSearcher.doc(docId);
133                 // 把Document轉為Article
134                 Article article = ArticleDocumentUtils.documentToArticle(doc);
135                 list.add(article);
136             }
137             indexSearcher.close();
138 
139             // 顯示結果
140             System.out.println("總結果數:" + list.size());
141             for (Article a : list) {
142                 System.out.println("------------------------------");
143                 System.out.println("id = " + a.getId());
144                 System.out.println("title = " + a.getTitle());
145                 System.out.println("content = " + a.getContent());
146             }
147         } catch (Exception e) {
148             throw new RuntimeException(e);
149         }
150     }
151 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM