1. 程式人生 > >lucene記憶體索引庫、分詞器

lucene記憶體索引庫、分詞器

記憶體索引庫

特點

         在記憶體中開闢一塊空間,專門為索引庫存放。這樣有以下幾個特徵:

1)    因為索引庫在記憶體中,所以訪問速度更快。

2)    在程式退出時,索引庫中的檔案也相應的消失了。

3)    如果索引庫比較大,必須得保證足夠多的記憶體空間。

編碼

在cn.hqu.directory 下新建:DirectoryTest

/**

 * 1、能不能設定很多個索引庫

 *    可以設定很多個索引庫

 * 2、索引庫能不能合併起來

 *    如果是記憶體索引庫

 *      Directory ramDirectory = new RamDirectory(Directory d);

 *         這樣就可以把一個索引庫放入到記憶體索引庫中

 *    利用IndexWriter.addIndexesNoOptimize方法可以把很多個索引庫進行合併操作

 * 3、應用程式能不能在記憶體中和索引庫進行互動

 * @author Administrator

 *

 */

public class DirectoryTest {

    /**

     * 記憶體索引庫

     *   *  速度比較快

     *   *  資料是暫時的

     *   *  記憶體索引庫和檔案索引庫的特點正好互補

     */

    @Test

    public void

testRam() throws Exception{

        Directory directory = new RAMDirectory();

        IndexWriter indexWriter = new IndexWriter(directory,LuceneUtils.analyzer,

                MaxFieldLength.LIMITED);

        Article article = new Article();

        article.setId(1L);

        article.setTitle("lucene

可以做搜尋引擎");

        article.setContent("baidu,google都是很好的搜尋引擎");

        indexWriter.addDocument(DocumentUtils.article2Document(article));

        indexWriter.close();

        this.showData(directory);

    }

    private void showData(Directory directory) throws Exception{

        IndexSearcher indexSearcher = new IndexSearcher(directory);

        QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30,

                new String[]{"title","content"},LuceneUtils.analyzer);

        Query query = queryParser.parse("lucene");

        TopDocs topDocs =indexSearcher.search(query, 10);

        ScoreDoc[] scoreDocs = topDocs.scoreDocs;

        List<Article> articleList = new ArrayList<Article>();

        for(ScoreDoc scoreDoc:scoreDocs){

            Document document =indexSearcher.doc(scoreDoc.doc);

            articleList.add(DocumentUtils.document2Article(document));

        }

        for(Article article:articleList){

            System.out.println(article.getId());

            System.out.println(article.getTitle());

            System.out.println(article.getContent());

        }

    }

}

         在執行完這段程式碼以後,並沒有在磁碟上出現索引庫。所以單獨使用記憶體索引庫沒有任何意義。

檔案索引庫與記憶體索引庫的結合


                            當應用程式啟動的時候,從檔案索引庫載入檔案到記憶體索引庫。應用程式直接與記憶體索引庫互動。當應用程式退出的時候,記憶體索引庫把資料再次儲存到檔案索引庫,完成檔案的儲存工作。

    /**

     * 檔案索引庫和記憶體索引庫的結合,提高效率

     */

    @Test

    public void testRamAndFile() throws Exception{

        /**

         *1、當應用程式啟動的時候,把檔案索引庫的內容複製到記憶體庫中

         *2、讓記憶體索引庫和應用程式互動

         *3、把記憶體索引庫的內容同步到檔案索引庫

         */

        Directory fileDirectory =FSDirectory.open(new File("./indexDir"));

        Directory ramDirectory = new RAMDirectory(fileDirectory);

        IndexWriter ramIndexWriter = new IndexWriter(ramDirectory,

                LuceneUtils.analyzer,MaxFieldLength.LIMITED);

        IndexWriter fileIndexWriter = new IndexWriter(fileDirectory,

                LuceneUtils.analyzer,true,MaxFieldLength.LIMITED);

        /**

在記憶體索引庫中根據關鍵詞查詢在

         *啟動的時候,把檔案目錄的索引庫載入到記憶體目錄中,

 * 退出時把記憶體目錄的索引庫儲存到檔案目錄

         */

        this.showData(ramDirectory);

        System.out.println("上面的是從記憶體索引庫中查詢出來的");

        /**

         *把一條資訊插入到記憶體索引庫

         */

        Article article = new Article();

        article.setId(1L);

        article.setTitle("lucene可以做搜尋引擎");

        article.setContent("baidu,google都是很好的搜尋引擎");

        ramIndexWriter.addDocument(DocumentUtils.article2Document(article));

        ramIndexWriter.close();

        /*

         *把記憶體索引庫中的內容同步到檔案索引庫中

         */

        fileIndexWriter.addIndexesNoOptimize(ramDirectory);

        fileIndexWriter.close();

        this.showData(fileDirectory);

        System.out.println("上面的是從檔案索引庫中查詢出來的");

      }

               說明:

1)    Directory ramdirectory = newRAMDirectory(filedirectory);把filedirectory這個索引庫載入到ramdirectory記憶體庫中

2)    IndexWriter的建構函式:

       IndexWriterfileIndexWriter = new IndexWriter(fileDirectory,

              LuceneUtils.analyzer,true,MaxFieldLength.LIMITED);

                         True     重新建立一個或者覆蓋(選擇)

                         False    追加

1.             分詞器

1.1英文分詞器

         步驟:Creates a searcher searching the index in the nameddirectory

1)    切分關鍵詞

Creates  

a  

searcher 

searching 

the 

index 

the 

named 

directory

2)    去除停用詞

停用詞:有些詞在文字中出現的頻率非常高。但對本文的語義產生不了多大的影響。例如英文的a、an、the、of等。或中文的”的、了、呢等”。這樣的詞稱為停用詞。停用詞經常被過濾掉,不會被進行索引。在檢索的過程中,如果使用者的查詢詞中含有停用詞,系統會自動過濾掉。停用詞可以加快索引的速度,減少索引庫檔案的大小。

Creates

searcher

searching

index

named

directory

3)    轉為小寫(搜尋時不區分大小寫,因為分詞器會幫你轉化)

creates

searcher

searching

index

named

directory

1.1.1程式碼:

    @Test

    public voidtestEn() throwsException{

       /**

        * Creates a searcher searching the index inthe named directory

        */

       /**

        * 1、切分關鍵詞

        * 2、去掉停用詞

        * 3、把大寫轉化成小寫

        */

       Stringtext = "Creates a searcher searching the index in the nameddirectory";

       Analyzeranalyzer = new StandardAnalyzer(Version.LUCENE_30);

       this.testAnalyzer(analyzer,text);

    }

    /**

     * 經過該方法可以把分詞後的結果輸出

     * @param analyzer

     * @param text

     * @throws Exception

     */

     private voidtestAnalyzer(Analyzer analyzer,String text)throwsException{

         TokenStream tokenStream = analyzer.tokenStream("content",new StringReader(text));

         tokenStream.addAttribute(TermAttribute.class);

         while(tokenStream.incrementToken()){

              TermAttribute termAttribute =tokenStream.getAttribute(TermAttribute.class);

              System.out.println(termAttribute.term());

         }

     }

1.2中文分詞器

1.2.1單字分詞

       /**

        * 單字分詞

        */

       Analyzeranalyzer = newChineseAnalyzer();

       Stringtext = "新北校區有一個是UFO";

       this.testAnalyzer(analyzer,text);

                   把漢字一個字一個字分解出來。效率比較低。

1.2.2二分法分詞

       Analyzeranalyzer = newCJKAnalyzer(Version.LUCENE_30);

       Stringtext = "新北校區有一個是UFO";

       this.testAnalyzer(analyzer, text);

把相鄰的兩個字組成詞分解出來,效率也比較低。而且很多情況下分的詞不對。

1.2.3詞庫分詞(IKAnalyzer)

       Analyzeranalyzer = newIKAnalyzer();

       Stringtext = "北京美女";

       this.testAnalyzer(analyzer, text);

匯入IKAnalyzer的jar包。

網盤年下載:http://pan.baidu.com/s/1nt9eqVZ

基本上可以把詞分出來(經常用的分詞器)


1.2.4詞庫的擴充

                   “新北小去的阿爾法四了”分此後的結果為:

                   新、北、小、去、阿爾法、四、了

         在src下新建:ext_stopword.dic、IKAnalyzer.cfg.xml、mydict.dic。

ext_stopword.dic為停止詞的詞庫,詞庫裡的詞都被當作為停止詞使用。

IKAnalyzer.cfg.xml為IKAnalyzer的配置檔案。

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEpropertiesSYSTEM"http://java.sun.com/dtd/properties.dtd"> 

<properties> 

    <comment>IK Analyzer 擴充套件配置</comment>

    <entrykey="ext_dict">/mydict.dic</entry> 

    <entrykey="ext_stopwords">/ext_stopword.dic</entry>

</properties>

                            Key為ext_stopwords 為停止詞所在的位置。

      Key為ext_dict為配置自己的擴充套件字典所在的位置。如圖所示可以在mydict.dic中新增自己所需要的詞。如:”新北小去”

      新增完以後分詞器分” “新北小去的阿爾法四了”結果為:

                   新北小去、阿爾法、四、了

ext_stopword.dic如下:






使

























mydict.dic 內容如下:

新北小去

1.2.5修改LuceneUtils類

                   analyzer = new IKAnalyzer();

                   以後用的分詞庫為IKAnalyzer中文分詞庫。




相關推薦

lucene記憶體索引

記憶體索引庫 特點          在記憶體中開闢一塊空間,專門為索引庫存放。這樣有以下幾個特徵: 1)    因為索引庫在記憶體中,所以訪問速度更快。 2)    在程式退出時,索引庫中的檔案也相應的消失了。 3)    如果索引庫比較大,必須得保證足夠多的記憶體空

JAVAWEB開發之Lucene詳解——Lucene入門及使用場景全文檢索索引CRUD優化索引高亮相關度排序各種查詢

Lucene入門 應用場景 windows系統中的有搜尋功能:開啟“我的電腦”,按“F3”就可以使用查詢的功能,查詢指定的檔案或資料夾。搜尋的範圍是整個電腦中的檔案資源。 Eclipse中的幫助子系統:點選Help->Help Contents,可以查找出相關的幫助資

關於ElasticSearch中分析器等相關知識的總結

分析器(Analyzer) 在說分詞器(Tokenizers)之前,需要了解一個很重要的概念就是分析器(Analyzer)。分析器分析的過程就是將文字轉換為標記(tokens)或術語的過程,這些標記或術語被新增到倒排索引中以便進行搜尋。分析器(Analyzer)跟

ElasticSearch(四)查詢

正向索引     正排表是以文件的ID為關鍵字,表中記錄文件中每個字的位置資訊,查詢時掃描表中每個文件中字的資訊直到找出所有包含查詢關鍵字的文件。   這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易於維護;因為索引是基於文件建立的,若是有新的文件加入,直接為該文件建立一個新的索引塊

Lucene之中文庖丁解牛(mmseg)-yellowcong

庖丁解牛分詞器,分詞器和Lucene的版本需要注意,有可能有衝突,報錯,我最開始是1.8.5的mmseg4j和一個lucene有衝突,後來,換了Mmseg4j版本後,就好了 下載地址 #這個

Elasticsearch 5.2.1 建立索引-自定義

開發語言:JAVA 解決問題:ES 5.2.1預設使用的 standard 分詞器,該分詞器是單個漢字進行分詞的,而需求使用二元分詞,故使用ngram 實現二元分詞 通過mapping 將分詞器 與要分詞的欄位進行對映 示例程式碼: // DoubleAnalyzer

基於lucene的案例開發:介紹

      在lucene建立索引的過程中,資料資訊的處理是一個十分重要的過程,在這一過程中,主要的部分就是這一篇部落格的主題:分詞器。在下面簡單的demo中,介紹了7中比較常見的分詞技術,即:CJKAnalyzer、KeywordAnalyzer、SimpleAnaly

Elasticsearch系列---倒排索引原理與

概要 本篇主要講解倒排索引的基本原理以及ES常用的幾種分詞器介紹。 倒排索引的建立過程 倒排索引是搜尋引擎中常見的索引方法,用來儲存在全文搜尋下某個單詞在一個文件中儲存位置的對映。通過倒排索引,我們輸入一個關鍵詞,可以非常快地獲取包含這個關鍵詞的文件列表。 我們先看英文的,假設我們有兩個文件: I have

搜索引擎系列四:Lucene提供的IKAnalyze中文集成

author oid core 長度 maven項目 int get attribute clu 一、Lucene提供的分詞器StandardAnalyzer和SmartChineseAnalyzer 1.新建一個測試Lucene提供的分詞器的maven項目LuceneAn

elasticsearch系列三:索引詳解(文檔管理路由詳解)

ces com dex 合並 pda ams 最新 case dbi 一、分詞器 1. 認識分詞器 1.1 Analyzer 分析器 在ES中一個Analyzer 由下面三種組件組合而成: character filter :字符過濾器,對文本進行字符過濾處理,

ElasticSearch 用ik建立索引(java API)

tle creat analyzer undefined 全文搜索 () map 多用戶 tcl   ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Ja

(五)Lucene——中文

實現 ext cse ron -a tag 大小 -c .com 1. 什麽是中文分詞器 對於英文,是安裝空格、標點符號進行分詞 對於中文,應該安裝具體的詞來分,中文分詞就是將詞,切分成一個個有意義的詞。 比如:“我的中國人”,分詞:我、的、中

Lucene.net(4.8.0) 學習問題記錄五: JIEbaLucene的結合,以及對的思考

+= d+ ext eth reac chart rdl ret start 前言:目前自己在做使用Lucene.net和PanGu分詞實現全文檢索的工作,不過自己是把別人做好的項目進行遷移。因為項目整體要遷移到ASP.NET Core 2.0版本,而Lucene使用的版本

Lucene介紹及簡單入門案例(集成ik

chinese depend 創建索引 圖片 latest frame numeric id字段 div 介紹     Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個

Lucene搜尋引擎-

文章目錄 Lucene初識 適用場景 特性 Lucene初識 分詞器 正向索引 反向索引 Lucene自帶分詞器 專案整合IKAnalyzer分詞器 IKAnalyze擴充套件

Linux下ElasticSearch6.4.xElasticSearch-HeadKibana以及中文IK的安裝配置

ElasticSearch 安裝配置 下載 # 官網下載壓縮包 [[email protected] /home]#  wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.

Lucene筆記20-Lucene-實現自定義同義詞-實現(良好設計方案)

一、目前存在的問題 在getSameWords()方法中,我們使用map臨時存放了兩個鍵值對用來測試,實際開發中,往往需要很多的這種鍵值對來處理,比如從某個同義詞詞典裡面獲取值之類的,所以說,我們需要一個類,根據key提供近義詞。 為了能更好的適應應用場景,我們先定義一個介面,其中定義一

Lucene筆記19-Lucene-實現自定義同義詞-實現

一、同義詞分詞器的程式碼實現 package com.wsy; import com.chenlb.mmseg4j.Dictionary; import com.chenlb.mmseg4j.MaxWordSeg; import com.chenlb.mmseg4j.analysis.MM

Lucene筆記18-Lucene-實現自定義同義詞-思路分析

一、實現自定義同義詞分詞器思路分析 前面文章我們提到同義詞分詞器,這裡我們先來分析下同義詞分詞器的設計思路。 首先我們有一個需要分詞的字串string,通過new StringReader(string)拿到Reader。 使用analyzer.tokenStream("co

Lucene筆記14-Lucene-的原理講解

一、分詞器原理 最主要的分詞器有SimpleAnalyzer、StopAnalyzer、WhitespaceAnalyzer、StandardAnalyzer。 先來研究一下SimpleAnalyzer。當一串資料傳進來之後,會被轉化成TokenStream這樣一個東西,這個TokenS