1. 程式人生 > >Lucene 例項教程(四)之檢索方法總結

Lucene 例項教程(四)之檢索方法總結

最近研究資料庫模糊查詢,發現oracle資料庫中雖然可以用instr來替代like提高效率,但是這個效率提高是有瓶頸的,可以用搜索引擎技術來進一步提高查詢效率

一、 前言

       在專案實戰中,這還不能完全解決一些比較棘手的問題,比如:

       1、前面只提供了一種開啟索引檔案的方式 和 一種 實現全文檢索的方式,檢索方式的單一性不能根據檢索條件權衡篩選最優檢索方式;

       2、並且在檢索的時候還有一點排序上的瑕疵,最優匹配的document物件並沒有顯示在最上面, 以及 無法實現對索引結果的操作。

       接下來介紹幾中檢索索引的方式,比如多欄位搜尋、多條件搜尋、模糊搜尋、字首搜尋、使用過濾器過濾查詢等等,使用了這些方式之後,可以更好的理解Lucene的執行原理和檢索方式的多樣化。 其中的好處還需要慢慢去理解和體會。

二、使用Lucene實戰

1、通過QueryParser繫結單個欄位來檢索索引記錄

    這是一種最為簡單的查詢方式,首先封裝好QueryParser這個查詢轉換器,然後根據關鍵字封裝查詢物件,這個做好之後交給IndexSearch就可以返回結果了。

具體程式碼如下:

[java] view plain copy  print?
  1. package com.lucene.test;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. import org.apache.lucene.analysis.Analyzer;  
  8. import org.apache.lucene.document.Document;  
  9. import org.apache.lucene.index.CorruptIndexException;  
  10. import org.apache.lucene.index.Term;  
  11. import org.apache.lucene.queryParser.MultiFieldQueryParser;  
  12. import org.apache.lucene.queryParser.ParseException;  
  13. import org.apache.lucene.queryParser.QueryParser;  
  14. import org.apache.lucene.search.BooleanClause;  
  15. import org.apache.lucene.search.BooleanQuery;  
  16. import org.apache.lucene.search.Filter;  
  17. import org.apache.lucene.search.FilteredQuery;  
  18. import org.apache.lucene.search.IndexSearcher;  
  19. import org.apache.lucene.search.PrefixQuery;  
  20. import org.apache.lucene.search.Query;  
  21. import org.apache.lucene.search.QueryWrapperFilter;  
  22. import org.apache.lucene.search.ScoreDoc;  
  23. import org.apache.lucene.search.Sort;  
  24. import org.apache.lucene.search.SortField;  
  25. import org.apache.lucene.search.TermQuery;  
  26. import org.apache.lucene.search.TopDocs;  
  27. import org.apache.lucene.search.WildcardQuery;  
  28. import org.apache.lucene.store.Directory;  
  29. import org.apache.lucene.store.SimpleFSDirectory;  
  30. import org.apache.lucene.util.Version;  
  31. import org.wltea.analyzer.lucene.IKAnalyzer;  
  32. import com.lucene.entity.Article;  
  33. /** 
  34.  * Lucene 檢索各種索引的實現方式總結 
  35.  * @author Administrator 
  36.  * 
  37.  */
  38. publicclass LuceneSearchDemo {  
  39.     publicstaticfinal String INDEX_DIR_PATH = "indexDir";  
  40.     /* 建立簡單中文分析器 建立索引使用的分詞器必須和查詢時候使用的分詞器一樣,否則查詢不到想要的結果 */
  41.     private Analyzer analyzer = null;  
  42.     // 索引儲存目錄
  43.     private File indexFile = null;  
  44.     //目錄物件,因為操作索引檔案都要用到它,所以定義為全域性變數
  45.     private Directory directory = null;  
  46.     //索引搜尋物件
  47.     private IndexSearcher indexSearcher;  
  48.     /** 
  49.      * 初始化方法 
  50.      * @throws IOException  
  51.      */
  52.     publicvoid init() throws IOException{  
  53.         analyzer = new IKAnalyzer(true);  
  54.         indexFile = new File(INDEX_DIR_PATH);  
  55.         directory = new SimpleFSDirectory(indexFile);  
  56.         indexSearcher = new IndexSearcher(directory);  
  57.         System.out.println("*****************初始化成功**********************");  
  58.     }  
  59.     /** 
  60.      * 根據傳遞的結果集 封裝成集合後顯示出來 
  61.      * @param scoreDocs 
  62.      * @throws IOException  
  63.      * @throws CorruptIndexException  
  64.      */
  65.     publicvoid showResult(ScoreDoc[] scoreDocs) throws CorruptIndexException, IOException{  
  66.         List<Article> articles = new ArrayList<Article>();  
  67.         for (int i = 0; i < scoreDocs.length; i++) {  
  68.             int doc = scoreDocs[i].doc;//索引id
  69.             Document document = indexSearcher.doc(doc);  
  70.             Article article = new Article();  
  71.             if (document.get("id") == null) {  
  72.                 System.out.println("id為空");  
  73.             } else {  
  74.                 article.setId(Integer.parseInt(document.get("id")));  
  75.                 article.setTitle(document.get("title"));  
  76.                 article.setContent(document.get("content"));  
  77.                 articles.add(article);  
  78.             }             
  79.         }  
  80.         if(articles.size()!=0){  
  81.             for (Article article : articles) {  
  82.                 System.out.println(article);  
  83.             }  
  84.         }else{  
  85.             System.out.println("沒有查到記錄。");  
  86.         }  
  87.     }  
  88.     /** 
  89.      * 通過QueryParser繫結單個欄位來檢索索引記錄 
  90.      * @param keyword 
  91.      * @throws ParseException  
  92.      * @throws IOException  
  93.      * @throws CorruptIndexException  
  94.      */
  95.     publicvoid searchByQueryParser(String keyword) throws ParseException, CorruptIndexException, IOException{  
  96. 相關推薦

    Lucene 例項教程()檢索方法總結

    最近研究資料庫模糊查詢,發現oracle資料庫中雖然可以用instr來替代like提高效率,但是這個效率提高是有瓶頸的,可以用搜索引擎技術來進一步提高查詢效率 一、 前言        在專案實戰中,這還不能完全解決一些比較棘手的問題,比如

    jQuery基礎常用方法總結

    一個 常用方法 () html query div 常用 jquery 子集 ①jQuery中的find()方法 <div class="css">   <p class="rain">測試1</p> </div> <d

    Docker教程基於Centos7的MySql環境映象

    好久沒有寫 docker 映象的構建了。 我之前完成了web專案的部署,和簡單的負載,但是缺少對資料庫的映象,而且我的Web也都為靜態頁面,所以在接著對我的web專案進行加工前,需要使用到資料庫,個人伺服器有限,所以還是以構建映象的方式進行新增資料庫我採用 mysql因為我對

    Dagger2教程構造方法帶引數的情況(原)

            為了介紹Dagger2的使用,我們搭建了一個Demo來逐步分析,大家可以在這裡下載原始碼(https://github.com/dushaofeng/DaggerDemo.git)。         前面一節介紹了Dagger2最簡單的使用場景,但是在結尾我

    Android入門教程()------Android工程目錄結構介紹

    當我們建立完Android工程如(HelloAndroid)後,展開"Package Explorer"窗口裡的"HelloAndroid"項名稱,可以看見如下目錄結構:   res:放置應用 程式 用到的資源 檔案。其包含(Drawable,layout,values等目錄

    Lucene全文檢索引擎工具包使用方法總結

    Lucene是apache軟體基金會4 jakarta專案組的一個子專案,是一個開放原始碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文字分析引擎(英文與德文兩種西方語言)。Lucene的目的是為軟體

    工廠方法模式-Factory Method Pattern 工廠三兄弟工廠方法模式():過載的工廠方法,工廠方法的隱藏,工廠方法模式總結

    5 過載的工廠方法        Sunny公司開發人員通過進一步分析,發現可以通過多種方式來初始化日誌記錄器,例如可以為各種日誌記錄器提供預設實現;還可以為資料庫日誌記錄器提供資料庫連線字串,為檔

    構建法三、、五章總結

    創業 安排 便是 為什麽 軟件 構建 似的 讓我 生活 趁著五一小短假期間閱讀了這三章,讓我感覺想要成為一名軟件工程師的路還要很長,在我面前就出現了一條分叉路:即是成為一名個人能力優異但不顧及團隊成員理解與否的程序員還是個人能力一般但會結合團隊人員的理解能力去編程的程序員,

    ECMAScript面向對象(二)——創建對象方法總結

    擴展 console 動態 原型 struct 私有屬性 true asc 一份 創建對象的方法 工廠模式 缺點:無法識別對象的類型,因為根本沒有定義新的對象類型 // 工廠模式創建對象 //定義 function createPerson(name,age,

    輕松學習Linux教程 神器vi程序編輯器攻略

    分享 內置 snippet 2014年 答案 程序 ice 界面 fff 本系列文章由@超人愛因斯坦出品,轉載請註明出處。 文章鏈接: http://hpw123.net/a/Linux/Linuxjichu/2014

    JavaScript進階常用字符串方法總結

    com lastindex 作用 ng2 slice index bstr 屬性和方法 script 前面三篇文章簡單的把JavaScript基礎內容過了一遍,我們已經可以用JavaScript寫一些簡單的代碼了。 今天主要總結一下JavaScript中String對象中自

    vue中組件的方法總結

    end bsp nbsp 四種 temp recommend show -s com 希望對大家有用 全局組件的第一種寫法 html: <div id = "app"> <show></show></div>

    JS學習路系列總結象陣(此文猶如武林之中的易筋經,是你馳騁IT界的武功心法,學會JS五大陣法就學會了JS,博主建議先學三才陣)

    元素 ins dom 命名 aslist element 多個 及其 nod 四象陣法: 增加 刪除 改變 查找 【為了便於記憶,減少占用大腦內存,我命名為JS心法為:道陣法,兩儀陣法,三才陣法,四象陣法,五行陣法,只需記住陣法的關鍵字,即可搜索大腦中相應的內容,學

    JavaScript數組五大叠代方法總結

    col per apr 分數 沒有 dex 操作 指定 和數 ES5定義了五個叠代方法,每個方法都接收兩個參數:要在每一項上運行的函數和運行該函數的作用域對象(可選的),作用域對象將影響this的值。傳入這些方法中的函數會接收三個參數:數組的項的值、該項在數組中的位置和數組

    C#基礎匿名方法實例教程

    for html ora http請求 true sta open 使用方式 技術分享 本文以實例形式講解了C#的匿名方法的用法,分享給大家供大家參考之用。具體如下: 匿名方法是C# 2.0的語言新特性。首先看個最簡單的例子:class Program { static

    演算法設計五大常用演算法設計方法總結

    演算法設計之五大常用演算法設計方法總結 一、【分治法】  在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個

    Spring知識點總結()SpringAOP基礎 - 代理設計模式

        1. 分析程式中存在的問題(高內聚,低耦合)        通過springIOC DI) 以及註解的使用,成功解決了在程式中層與層之間出現的耦合的問題,但是在很多地方仍然存在非該層應該實現的功能,造成了 無法“

    flutter自定義View(CustomPainter) canvas的方法總結

    前有大佬分享了用CustomPaint畫一個自定義的CircleProgressBar的文章, 今天我分享一波自定義View(CustomPaint)的一些基礎知識 畫布canvas 畫布是一個矩形區域,我們可以控制其每一畫素來繪製我們想要的內容 canvas 擁有多種繪製點、線、路徑、矩形、圓形、以及

    Spring知識點總結()SpringAOP基礎

        1. Spring aop中的基本概念        • 連線點(Joinpoint):在程式執行過程中某個特定的點,比如某方法呼叫的時候或者處理異常的時候。在Spring AOP中,一個連線點總是表示一個方法的

    Java程式設計師從笨鳥到菜鳥(十)Html基礎總結(上)

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!