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中的內容文件已經建立出來了數據庫

索引已經建立,接下來查詢一下試試索引 ,傳入須要查詢的詞apache

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 擴展中止詞典,分詞中不想出現的,不但願他被分開出現或單獨的,能夠往裏面寫,檢索的時候就不會有優化

第二個:是指定上面兩個擴展詞典的編碼

這些就是最基本掌握的內容,還有不少分詞算法等類型,須要去擴展

 

 
     【版本聲明】本文爲博主原創文章,轉載請註明出處
相關文章
相關標籤/搜索