基於Lucene的查詢索引


1.1. 實現步驟

  第一步:創建一個Directory對象,也就是索引庫存放的位置。

  第二步:創建一個indexReader對象,需要指定Directory對象。

  第三步:創建一個indexsearcher對象,需要指定IndexReader對象

  第四步:創建一個TermQuery對象,指定查詢的域和查詢的關鍵詞。

  第五步:執行查詢。

  第六步:返回查詢結果。遍歷查詢結果並輸出。

  第七步:關閉IndexReader對象

1.2.IndexSearcher搜索方法

1.3.query查詢語句對象

  對要搜索的信息創建Query查詢對象,Lucene會根據Query查詢對象生成最終的查詢語法,類似關系數據庫Sql語法一樣Lucene也有自己的查詢語法,比如:“name:lucene”表示查詢Field的name為“lucene”的文檔信息。

  1.3.1.使用QueryParser查詢

    通過QueryParser也可以創建Query,QueryParser提供一個Parse方法,此方法可以直接根據查詢語法來查詢。Query對象執行的查詢語法可通過System.out.println(query);查詢。需要使用到分析器。創建索引時使用的分析器和查詢索引時使用的分析器要一致。

  1.3.2.使用query的子類查詢

    TermQuery:

             根據詞進行搜索(只能從文本中進行搜索)

    QueryParser:

             根據域名進行搜索,可以設置默認搜索域,推薦使用. (只能從文本中進行搜索)

    NumericRangeQuery:

             從數值范圍進行搜索

    BooleanQuery:

             組合查詢,可以設置組合條件,not and or.從多個域中進行查詢

               must相當於and關鍵字,是並且的意思

           should,相當於or關鍵字或者的意思

           must_not相當於not關鍵字, 非的意思

           注意:單獨使用must_not  或者 獨自使用must_not沒有任何意義

    MatchAllDocsQuery:

             查詢出所有文檔

    MultiFieldQueryParser:

             可以從多個域中進行查詢,只有這些域中有關鍵詞的存在就查詢出來

1.4.代碼

 1 @Test
 2 public void testIndexSearch() throws Exception{
 3 
 4     //創建分詞器(與創建索引用同樣的分詞器)
 5     Analyzer analyzer=new StandardAnalyzer();
 6     //創建查詢對象:第一個參數:默認搜索域  第二個參數 :分詞器
 7     //默認搜索的作用:如果搜索語法中指定了域名,從指定域中搜索,如果未指定從默認搜索域中搜索
 8     QueryParser queryParser=new QueryParser("fileContext",analyzer);
 9     //查詢語法 域名:搜索關鍵字
10     Query query = queryParser.parse("fileContext:java");
11 
12 
13     //指定索引的目錄
14     Directory directory= FSDirectory.open(new File("E:\\ideaworkpase\\demotest\\luceneindex"));
15     //索引的讀取對象
16     IndexReader indexReader=IndexReader.open(directory);
17     //創建索引的搜索對象
18     IndexSearcher indexSearcher=new IndexSearcher(indexReader);
19     //搜索:第一個參數:查詢語句對象  第二個參數:指定顯示記錄數
20     TopDocs search = indexSearcher.search(query, 10);
21     //一共搜索到多少條記錄
22     System.out.println("====total===:"+search.totalHits);
23 
24     //從搜索結果對象中獲取結果集
25     ScoreDoc [] scoreDocs=search.scoreDocs;
26     for(ScoreDoc scoreDoc:scoreDocs){
27         //獲取Id
28         int docID=scoreDoc.doc;
29         //通過文檔ID從硬盤上獲取文檔
30         Document document = indexReader.document(docID);
31         //get域名,打印出值
32         System.out.println("+++++fileName++++:"+document.get("fileName"));
33     }

 

 

 

 


免責聲明!

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



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