首頁 >Java >java教程 >Lucene的配置以及創建索引全文檢索的圖文代碼詳解

Lucene的配置以及創建索引全文檢索的圖文代碼詳解

黄舟
黄舟原創
2017-09-06 10:03:011595瀏覽

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 擴展停止詞典,分詞中不想出現的,不希望他被分開出現或單獨的,可以往裡面寫,檢索的時候就不會有######第二個:是指定上面兩個擴展詞典的############ ###這些就是最基本掌握的內容,還有很多分詞演算法等類型,需要去擴展###

以上是Lucene的配置以及創建索引全文檢索的圖文代碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn