Lucene_demo06_幾種搜索

創建searcher的過程 
1、創建Directory 
2、根據directory創建indexReader 
3、根據indexReader創建indexSearcher 
4、創建搜索的Query 
5、根據searcher搜索並且返回TopDocs 
6、根據TopDocs獲取ScordDoc對象獲取具體的Document對象 
7、根據searcher和ScordDoc對象獲取具體的Document對象 
8、根據Document對象獲取需要的值 
9、關閉reader 

Java代碼  
  1. /** 
  2.  * @see 1、關鍵詞查詢 
  3.  * @see 2、查詢所有的文檔 重點 
  4.  * @see 3、範圍查詢 
  5.  * @see 4、通配符查詢 重點 
  6.  * @see 5、短語查詢 
  7.  * @see 6、Boolean查詢 重點 
  8.  */  
  9. public class QueryTest {  
  10.     /** 
  11.      * 關鍵詞查詢 * 因爲在創建Term對象的時候,沒有分詞器,所以這裏的字母是區分大小寫的 * Term構造函數的第二個參數指的是關鍵詞,必須存在 
  12.      */  
  13.     @Test  
  14.     public void testTermQuery() throws Exception {  
  15.         Term term = new Term("title""總冠軍");  
  16.         Query query = new TermQuery(term);  
  17.         this.testSearchIndex(query);  
  18.     }  
  19.   
  20.     /** 
  21.      * 查詢所有的文檔 
  22.      */  
  23.     @Test  
  24.     public void testAllQuery() throws Exception {  
  25.         Query query = new MatchAllDocsQuery();  
  26.         this.testSearchIndex(query);  
  27.     }  
  28.   
  29.     /** 
  30.      * 通配符查詢 說明: * 代表任意多個任意字符 ? 代表一個任意字符 
  31.      */  
  32.     @Test  
  33.     public void testWildCardQuery() throws Exception {  
  34.         Term term = new Term("title""*總?軍");  
  35.         Query query = new WildcardQuery(term);  
  36.         this.testSearchIndex(query);  
  37.     }  
  38.   
  39.     /** 
  40.      * boolean查詢 可以根據Occur的常量把好幾個查詢結合在一起 
  41.      */  
  42.     @Test  
  43.     public void testBooleanQuery() throws Exception {  
  44.         Term term = new Term("title""總冠軍");  
  45.         TermQuery termQuery = new TermQuery(term);  
  46.   
  47.         Term term2 = new Term("content""2?13");  
  48.         Query wildCardQuery = new WildcardQuery(term2);  
  49.         BooleanQuery query = new BooleanQuery();  
  50.         query.add(termQuery, Occur.SHOULD);// Occur.MUST必須有、Occur.MUST_NOT必須沒有、Occur.SHOULD可以有  
  51.         query.add(wildCardQuery, Occur.SHOULD);  
  52.         this.testSearchIndex(query);  
  53.     }  
  54.   
  55.     /** 
  56.      * 範圍查詢 查詢id範圍在5~15間的數據 
  57.      */  
  58.     @Test  
  59.     public void testRangeQuery() throws Exception {  
  60.         Query query = NumericRangeQuery.newLongRange("id", 5L, 15L, truetrue);  
  61.         this.testSearchIndex(query);  
  62.     }  
  63.   
  64.     /** 
  65.      * 所有的Term對象只能在同一個field中進行 如果兩個以上大的關鍵詞進行組合查詢,得知道其中的位置(分詞後的位置) 
  66.      */  
  67.     @Test  
  68.     public void testPharseQuery() throws Exception {  
  69.         Term term = new Term("title""NBA總冠軍");  
  70.         Term term2 = new Term("title""NBA總冠軍");  
  71.         PhraseQuery phraseQuery = new PhraseQuery();  
  72.         phraseQuery.add(term);  
  73.         phraseQuery.add(term2);  
  74.         this.testSearchIndex(phraseQuery);  
  75.     }  
  76.   
  77.     // 公共輸出方法  
  78.     private void testSearchIndex(Query query) throws Exception {  
  79.         IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.directory);  
  80.         TopDocs topDocs = indexSearcher.search(query, 50);  
  81.         int count = topDocs.totalHits;// 總的記錄數  
  82.         ScoreDoc[] scoreDocs = topDocs.scoreDocs;  
  83.         List<Article> articleList = new ArrayList<Article>();  
  84.         for (int i = 0; i < scoreDocs.length; i++) {  
  85.             int index = scoreDocs[i].doc;  
  86.             Document document = indexSearcher.doc(index);  
  87.             Article article = DocumentUtils.document2Article(document);  
  88.             articleList.add(article);  
  89.         }  
  90.   
  91.         // 輸入搜索出來的內容  
  92.         for (Article article : articleList) {  
  93.             System.out.println(article.getId());  
  94.             System.out.println(article.getTitle());  
  95.             System.out.println(article.getContent());  
  96.         }  
  97.     }  
  98.   
  99. }  
發佈了5 篇原創文章 · 獲贊 5 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章