ES 筆記六:通過 Analyzer 進行分詞

CrazyZard發表於2019-10-15
  • Analysis - 文字分析是吧全文字轉換成一系列的單詞(term / token)的過程,也叫分詞
  • Analysis 是通過Analyzer來實現的
    • 可使用Elasticesearch 內建的分析器 或者按需求定製化分析器
  • 除了在資料寫入時轉換詞條,匹配Query語句時候也需要用相同的分析器會查詢語句進行分析

Analyzer 的組成

  • 分詞器是專門處理分詞的元件,Analyzer 由三部分組成
    • Character Filters (針對原始文字處理,例如去除html)
    • Tokenizer(按照規則切分為單詞)
    • Token Filter (將切分的單詞進行加工,小寫,刪除stopwords,增加同義語)

ES 筆記六:通過 Analyzer 進行分詞

Elastocsearch 的內建分詞器

  • Standard Analyzer - 預設分詞器,按詞切分,小寫處理
  • Simple Analyzer - 按照非字母切分(符號被過濾),小寫處理
  • Stop Analyzer - 小寫處理,停用詞過濾(the ,a,is)
  • Whitespace Analyzer - 按照空格切分,不轉小寫
  • Keyword Analyzer - 不分詞,直接將輸入當做輸出
  • Patter Analyzer - 正規表示式,預設 \W+
  • Language - 提供了30多種常見語言的分詞器
  • Customer Analyzer 自定義分詞器

使用 _analyzer Api

  • 直接指定Analyzer 進行測試
    GET _analyze
    {
      "analyzer": "standard",
      "text" : "Mastering Elasticsearch , elasticsearch in Action"
    }
    //返回結果
    {
      "tokens" : [
        {
          "token" : "mastering",
          "start_offset" : 0,
          "end_offset" : 9,
          "type" : "<ALPHANUM>",
          "position" : 0
        },
        {
          "token" : "elasticsearch",
          "start_offset" : 10,
          "end_offset" : 23,
          "type" : "<ALPHANUM>",
          "position" : 1
        },
        {
          "token" : "elasticsearch",
          "start_offset" : 26,
          "end_offset" : 39,
          "type" : "<ALPHANUM>",
          "position" : 2
        },
        {
          "token" : "in",
          "start_offset" : 40,
          "end_offset" : 42,
          "type" : "<ALPHANUM>",
          "position" : 3
        },
        {
          "token" : "action",
          "start_offset" : 43,
          "end_offset" : 49,
          "type" : "<ALPHANUM>",
          "position" : 4
        }
      ]
    }
  • 指定索引的欄位進行測試

    POST books/_analyze
    {
    "field": "title",
    "text": "Mastering Elasticesearch"
    }
  • 自定義分詞進行測試

    POST /_analyze
    {
      "tokenizer": "standard", 
      "filter": ["lowercase"],
      "text": "Mastering Elasticesearch"
    }
    //結果返回
    {
      "tokens" : [
        {
          "token" : "mastering",
          "start_offset" : 0,
          "end_offset" : 9,
          "type" : "<ALPHANUM>",
          "position" : 0
        },
        {
          "token" : "elasticesearch",
          "start_offset" : 10,
          "end_offset" : 24,
          "type" : "<ALPHANUM>",
          "position" : 1
        }
      ]
    }

Standard Analyzer

  • 預設的分詞器
  • 按詞切分
  • 小寫處理
    #standard
    GET _analyze
    {
    "analyzer": "standard",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }   

ES 筆記六:通過 Analyzer 進行分詞

Simple Analyzer

  • 按照非字母切分,非字母的都被去除
  • 小寫處理
    #simple 去除非字母的 :2 -  xi
    GET _analyze
    {
    "analyzer": "simple",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

Whitespace Analyzer

  • 空格切分
    #stop
    GET _analyze
    {
    "analyzer": "whitespace",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

    ES 筆記六:通過 Analyzer 進行分詞

Stop Analyzer

  • 相比 Simple Analyzer
  • 多了stop filter
    • 後把 the ,a, is,in 等修飾性詞語去除
      GET _analyze
      {
      "analyzer": "stop",
      "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
      }

ES 筆記六:通過 Analyzer 進行分詞

Keyword Analyzer

  • 不分詞,直接將輸入當作一個term輸出
    #keyword
    GET _analyze
    {
    "analyzer": "keyword",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

ES 筆記六:通過 Analyzer 進行分詞

Pattern Analyzer

  • 通過正則表達進行分詞
  • 預設是\W+,非字元的符號進行分隔
    GET _analyze
    {
    "analyzer": "pattern",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

ES 筆記六:通過 Analyzer 進行分詞

Language Analyzer

  • 各國語言分詞
    #english
    GET _analyze
    {
    "analyzer": "english",
    "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
    }

中文分詞的難點

  • 中文句子,切分成一個一個次(不是一個個字)
  • 英文中,單詞有自然的空格作為分隔
  • 一句中文,在不同的上下文,有不同的理解
    • 這個蘋果,不大好吃 / 這個蘋果,不大,好吃!
  • 一些例子
    • 他說的確實在理 / 這事的確定不下來

ICU Analyzer

  • 需要安裝plugin
    • Elasticsearch-plugin install analysis
    • 提過了Unicode的支援,更好的支援亞洲語言!

ES 筆記六:通過 Analyzer 進行分詞

給docker-compose安裝的es安裝外掛

    cd /var/docker/docker-es-7.3/
    docker exec -it es7_01 bash
    bin/elasticsearch-plugin install analysis-icu
    exit
    docker exec -it es7_02 bash
    bin/elasticsearch-plugin install analysis-icu
    exit
    docker-compose restart

#icu analyzer   
POST _analyze
{
  "analyzer": "icu_analyzer",
  "text": "他說的確實在理”"
}

更多的中文分詞器

相關文章