是一個開放原始碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。 Lucene的目的是為軟體開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。
(1)索引檔案格式獨立於應用程式平台。 Lucene定義了一套以8位元組為基礎的索引檔案格式,使得相容系統或不同平台的應用程式能夠共用建立的索引檔案。
(2)在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,能夠針對新的檔案建立小檔案索引,提升索引速度。然後透過與原有索引的合併,達到優化的目的。
(3)優秀的物件導向的系統架構,使得對於Lucene擴充的學習難度降低,方便擴充新功能。
(4)設計了獨立於語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的創立,用戶擴展新的語言和文件格式,只需要實現文本分析的接口。
(5)已經預設實作了一套強大的查詢引擎,使用者無需自己編寫程式碼即可使系統可獲得強大的查詢能力,Lucene的查詢實作中預設實作了布林操作、模糊查詢( Fuzzy Search[11])、分組查詢等等。
首先大家可以看一下這張圖,已經流傳許久了,在我的理解中的是:
左邊:是各種資料的採集,例如網路上,文本,資料庫等,採集到經過Lucene建立索引index
右邊:是使用者通過一些搜索,經過索引,返回結果的一個過程
#
很簡單導幾個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 擴展停止詞典,分詞中不想出現的,不希望他被分開出現或單獨的,可以往裡面寫,檢索的時候就不會有######第二個:是指定上面兩個擴展詞典的############ ###這些就是最基本掌握的內容,還有很多分詞演算法等類型,需要去擴展###
以上是Lucene的配置以及創建索引全文檢索的圖文代碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!