Lucene 是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是為軟體開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為 ...
Lucene
是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是為軟體開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。
優點
(1)索引文件格式獨立於應用平臺。Lucene定義了一套以8位位元組為基礎的索引文件格式,使得相容系統或者不同平臺的應用能夠共用建立的索引文件。 (2)在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然後通過與原有索引的合併,達到優化的目的。 (3)優秀的面向對象的系統架構,使得對於Lucene擴展的學習難度降低,方便擴充新功能。 (4)設計了獨立於語言和文件格式的文本分析介面,索引器通過接受Token流完成索引文件的創立,用戶擴展新的語言和文件格式,只需要實現文本分析的介面。 (5)已經預設實現了一套強大的查詢引擎,用戶無需自己編寫代碼即可使系統可獲得強大的查詢能力,Lucene的查詢實現中預設實現了布爾操作、模糊查詢(Fuzzy Search[11])、分組查詢等等。
概念
首先大家可以看一下這張圖,已經流傳許久了,在我的理解中的是: 左邊:是各種數據的採集,比如網上,文本,資料庫等,採集到經過Lucene建立索引index 右邊:是用戶通過一些搜索,經過索引,返回結果的一個過程
Lucene配置
很簡單導幾個jar包,創建一個索引文件 我用的是最新版本的6.6.0的核心包:lucene-core-6.6.0.jar,可以上官網下載http://lucene.apache.org/,這一個包就夠你測試用了 索引文件為:index,這個文件名可以隨便取,因為裡面內容自動生成,就是一個索引目錄,可以上網下載工具查看,感興趣可以去試試 然而這個jar包:IKAnalyzer6.5.0.jar,是一個analyzer分詞處理的擴展包,支持中文的分詞,這兩個目錄跟src目錄同級 不多說先上代碼: 首先根據上面的那張lucene的概念圖,我們需要先建立一個索引,這裡這些異常我直接拋出去了,其實需要處理的,太懶了
public static void createindex() throws Exception { //創建文件目錄 創建在項目目錄下的index中 Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/index")); //分詞處理 是一個抽象類 一種單字分詞,標準的 Analyzer analyzer=new IKAnalyzer(); //創建IndexWriterConfig對象 IndexWriterConfig config=new IndexWriterConfig(analyzer); //創建IndexWriter對象 IndexWriter iWriter=new IndexWriter(dir, config); //清除之前的索引 iWriter.deleteAll(); //創建文檔對象 Document doc=new Document(); //向文檔中添加文本內容欄位,及欄位類型 doc.add(new Field("fieldname","堅持到底gl博主的博文,轉載請註釋出處", TextField.TYPE_STORED)); //將文檔添加到indexWriter中,寫入索引文件中 iWriter.addDocument(doc); //關閉寫入 iWriter.close(); }
這樣運行可以看到你的索引index中的內容文件已經創建出來了
索引已經創建,接下來查詢一下試試索引 ,傳入需要查詢的詞
public static void search(String string) throws Exception { Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/search")); //打開索引目錄的 DirectoryReader dReader=DirectoryReader.open(dir); IndexSearcher searcher=new IndexSearcher(dReader); //第一個參數 field值 ,第二個參數用戶需要檢索的字元串 Term t=new Term("fieldname",string); //將用戶需要索引的字元串封裝成lucene能識別的內容 Query query=new TermQuery(t); //查詢,最大的返回值10 TopDocs top=searcher.search(query, 10); //命中數,那個欄位命中,命中的欄位有幾個 System.out.println("命中數:"+top.totalHits); //查詢返回的doc數組 ScoreDoc[] sDocs= top.scoreDocs; for (ScoreDoc scoreDoc : sDocs) { //輸出命中欄位內容 System.out.println(searcher.doc(scoreDoc.doc).get(field)); } }
就這樣一個全文檢索的測試就出來了,多去思考總結,擴展出去
再給添加一個代碼有益於理解
public static void main(String[] args) throws Exception { String chString="堅持到底的文章,轉載請註釋出處"; Analyzer analyzer=new IKAnalyzer(); TokenStream stream=analyzer.tokenStream("word", chString); stream.reset(); CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class); while (stream.incrementToken()) { System.out.println(cta.toString()); } stream.close(); }
顯示如下:
還可以添加這幾個文件,有一點需要註意的是,註意你的編碼格式
第一個:ext.dic 擴展詞典,分詞中那個需要組在一起的,如:分詞處理可能將“堅持到底”四個字分為“堅持”和“到底”,可以在這個文件中直接添加堅持到底,就可以顯示出堅持到底的這個索引
第三個:stopword.dic 擴展停止詞典,分詞中不想出現的,不希望他被分開出現或單獨的,可以往裡面寫,檢索的時候就不會有
第二個:是指定上面兩個擴展詞典的
這些就是最基本掌握的內容,還有很多分詞演算法等類型,需要去擴展
【版本聲明】本文為博主原創文章,轉載請註明出處