1. 程式人生 > >ES中的分析器和IK分詞器外掛

ES中的分析器和IK分詞器外掛




一些概念

Token(詞元)

全文搜尋引擎會用某種演算法對要建索引的文件進行分析, 從文件中提取出若干Tokenizer(分詞器)

Tokenizer(分詞器)

這些演算法叫做Tokenizer(分詞器)

Token Filter(詞元處理器)

這些Token會被進一步處理, 比如轉成小寫等, 這些處理演算法被稱為TokenFilter(詞元處理器)

Term(詞)

被處理後的結果被稱為Term(詞)

Character Filter(字元過濾器)

文字被Tokenizer處理前可能要做一些預處理, 比如去掉裡面的HTML標記, 這些處理的演算法被稱為Character Filter(字元過濾器)

Analyzer(分析器)

這整個的分析演算法被稱為Analyzer(分析器)

Analyzer(分析器)由Tokenizer(分詞器)和Filter(過濾器)組成

圖片

image

ES中的分詞器

ES內建分析器

  • standard analyzer
  • simple analyzer
  • stop analyzer
  • keyword analyzer
  • pattern analyzer
  • language analyzers
  • snowball analyzer
  • custom analyzer

ES內建分析器

  • standard tokenizer
  • edge ngram tokenizer
  • keyword tokenizer
  • letter analyzer
  • lowercase analyzer
  • ngram analyzers
  • whitespace analyzer
  • pattern analyzer
  • uax email url analyzer
  • path hierarchy analyzer

ES內建過濾器

  • standard filter
  • ascii folding filter
  • length filter
  • lowercase filter
  • ngram filter
  • edge ngram filter
  • porter stem filter
  • shingle filter
  • stop filter stop
  • word delimiter filter
  • stemmer token filter
  • stemmer override filter
  • keyword marker filter
  • keyword repeat filter
  • kstem filter
  • snowball filter
  • phonetic filter
  • synonym filter
  • compound word filter
  • reverse filter
  • elision filter
  • truncate filter
  • unique filter
  • pattern capture filter
  • pattern replace filter
  • trim filter
  • limit token count filter
  • hunspell filter
  • common grams filter
  • normalization filter

ES內建的character filter

  • mapping char filter 根據配置的對映關係替換字元
  • html strip char filter 去掉HTML元素
  • pattern replace char filter 用正則表示式處理字串

自定義分析器

ES允許使用者通過配置檔案elasticsearch.yml自定義分析器Analyzer

    index:
           analysis:
                     analyzer:
                            myAnalyzer:
                                   tokenizer: standard
                                   filter: [standard, lowercase, stop]

也可以使用第三方分析器,比如IKAnalyzer

IKAnalyzer

IK簡介

IK Analyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始, IKAnalyzer已經推出了4個大版本。最初,它是以開源專案Luence為應用主體的,結合詞典分詞和文法分析演算法的中文分片語件。從3.0版本開 始,IK發展為面向Java的公用分片語件,獨立於Lucene專案,同時提供了對Lucene的預設優化實現。在2012版本中,IK實現了簡單的分詞 歧義排除演算法,標誌著IK分詞器從單純的詞典分詞向模擬語義分詞衍化。

IK Analyzer 2012特性

1.採用了特有的“正向迭代最細粒度切分演算法“,支援細粒度和智慧分詞兩種切分模式;

2.在系統環境:Core2 i7 3.4G雙核,4G記憶體,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具有160萬字/秒(3000KB/S)的高速處理能力。

3.2012版本的智慧分詞模式支援簡單的分詞排歧義處理和數量詞合併輸出。

4.採用了多子處理器分析模式,支援:英文字母、數字、中文詞彙等分詞處理,相容韓文、日文字元

5.優化的詞典儲存,更小的記憶體佔用。支援使用者詞典擴充套件定義。特別的,在2012版本,詞典支援中文,英文,數字混合詞語。

安裝

  1. 執行命令:mvn clean package,打包生成elasticsearch-analysis-ik-1.2.5.jar
  2. 將這個jar拷貝到ES_HOME/plugins/analysis-ik目錄下面,如果沒有該目錄,則先建立該目錄
  3. ES_HOME/config/elasticsearch.yml檔案在檔案最後加入如下內容:
index:
  analysis:                   
    analyzer:      
      ik:
          alias: [ik_analyzer]
          type: org.elasticsearch.index.analysis.IkAnalyzerProvider
      ik_max_word:
          type: ik
          use_smart: false
      ik_smart:
          type: ik
          use_smart: true
index.analysis.analyzer.default.type: ik

測試

  1. 建立一個索引,名為index。
curl -XPUT http://localhost:9200/index
  1. 為索引index建立mapping
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
    "fulltext": {
             "_all": {
            "analyzer": "ik"
        },
        "properties": {
            "content": {
                "type" : "string",
                "boost" : 8.0,
                "term_vector" : "with_positions_offsets",
                "analyzer" : "ik",
                "include_in_all" : true
            }
        }
    }
}'
  1. 測試
curl 'http://localhost:9200/index/_analyze?analyzer=ik&pretty=true' -d '
{
"text":"世界如此之大"
}'

4.顯示結果

{
  "tokens" : [ {
    "token" : "text",
    "start_offset" : 4,
    "end_offset" : 8,
    "type" : "ENGLISH",
    "position" : 1
  }, {
    "token" : "世界",
    "start_offset" : 11,
    "end_offset" : 13,
    "type" : "CN_WORD",
    "position" : 2
  }, {
    "token" : "如此",
    "start_offset" : 13,
    "end_offset" : 15,
    "type" : "CN_WORD",
    "position" : 3
  }, {
    "token" : "之大",
    "start_offset" : 15,
    "end_offset" : 17,
    "type" : "CN_WORD",
    "position" : 4
  } ]
}