Elasticsearch Analyzer 內置分詞器

Elasticsearch Analyzer 內置分詞器

篇主要介紹一下 Elasticsearch中 Analyzer 分詞器的構成 和一些Es中內置的分詞器 以及如何使用它們

image-20221103233624275

前置知識

es 提供了 analyze api 可以方便我們快速的指定 某個分詞器 然後對輸入的text文本進行分詞 幫助我們學習和實驗分詞器

POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]

1.Analyzer

在ES中有很重要的一個概念就是 分詞,ES的全文檢索也是基於分詞結合倒排索引做的。所以這一文我們來看下何謂之分詞。如何分詞。

分詞器是專門處理分詞的組件,在很多中間件設計中每個組件的職責都劃分的很清楚,單一職責原則,以後改的時候好擴展。
分詞器由三部分組成。

  • Character Filters : 主要對原文本做處理, 例如 去除 html 標籤
  • Tokenizer : 按照規則 把文本切分爲單詞, 也就是分詞
  • Token Filters : 將切分後的單詞 進行加工處理, 小寫,刪除stopwords 停頓詞, 增加同義詞 , 擴展一些

分詞場景:

  1. 數據寫入index 的時候進行分詞
  2. query 查詢時候 需要對查詢文本 進行分詞

image-20221103163336660

2.Elasticsearch 內置分詞器

在es中有不少內置分詞器

  • Standard Analyzer : 默認分詞器, 按Unicode文本分割算法拆分 , 轉化爲小寫 , 支持中文(但是中文按照每個文字拆分,沒啥意義)
  • Simple Analyzer : 按照非字母切分 並且轉化爲小寫
  • Stop Analyzer : 和 simple 一樣 但是多了 過濾停用詞(the a is) 默認使用 stop token filter 的 _ _ english _ _ 預定義
  • Whitespace Analyzer : 每當遇到 空格的時候 會進行分詞 , 不會轉小寫
  • Keyword Analyzer : 不分詞 直接將輸入當做輸出
  • Patter Analyzer : 正則表達式
  • Language : 語言分詞器 30多種
  • Customer Analyzer : 自定義分詞器

3. Standard Analyzer

Standard 是es中默認的分詞器 , 它是按照 Unicode 文本分割算法去 對文本進行分詞的

POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]

3.1 Definition

包括了 轉小寫的 token filter 和 stop token filter 去除停頓詞

Tokenizer

  • [Standard Tokenizer]

Token Filters

  • [Standard Token Filter] : 沒用只是作爲保留的token filter (The standard token filter currently does nothing. It remains as a placeholder in case some filtering function needs to be added in a future version.)
  • [Lower Case Token Filter] : 轉小寫的 token filter
  • [Stop Token Filter] : 停頓詞 token filter 默認是沒有開啓

3.2 Configuration

  • max_token_length : 最大的分詞長度,如果超過此長度 則直接分詞 default 255
  • stopwords : 預定義的停頓詞列表 如: _ _ englisth _ _ 或者 停頓詞數組[] 默認 none 不設置
  • stopwords_path : 包含停頓詞的文件路徑

3.3 實驗

// 使用 自定義的分詞器 基於 standard
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "standard", 
          "max_token_length": 5, // 最大詞數
          "stopwords": "_english_" // 開啓過濾停頓詞 使用 englisth 語法
        }
      }
    }
  }
}


GET my_index/_analyze
{
  "analyzer": "my_english_analyzer",
  "text": "The hellogoodname jack"
}
// 可以看到 最長5個字符 就需要進行分詞了, 並且停頓詞 the 沒有了
["hello", "goodn", "ame", "jack"]

4. Simple Analyzer

簡單的分詞器 分詞規則就是 遇到 非字母的 就分詞, 並且轉化爲小寫,(lowercase tokennizer )

POST _analyze
{
  "analyzer": "simple",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

4.1 Definition

Tokenizer

  • Lower Case Tokenizer

4.2 Configuation

無配置參數

4.3 實驗

simple analyzer 分詞器的實現 就是如下

PUT /simple_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_simple": {
          "tokenizer": "lowercase",
          "filter": [         
          ]
        }
      }
    }
  }
}

5. Stop Analyzer

stop analyzer 和 simple analyzer 一樣, 只是多了 過濾 stop word 的 token filter , 並且默認使用 english 停頓詞規則

POST _analyze
{
  "analyzer": "stop",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 可以看到 非字母進行分詞 並且轉小寫 然後 去除了停頓詞
[ quick, brown, foxes, jumped, over, lazy, dog, s, bone ]

5.1 Definition

Tokenizer

  • Lower Case Tokenizer : 轉小寫的

Token filters

  • Stop Token Filter : 過濾停頓詞 默認使用 規則 english

5.2 Configuration

  • stopwords : 指定分詞的規則 默認 english , 或者分詞的數組
  • stopwords_path : 指定分詞停頓詞文件

5.3 實驗

如下就是對 Stop Analyzer 的實現 , 先轉小寫 後進行停頓詞的過濾

PUT /stop_example
{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        }
      },
      "analyzer": {
        "rebuilt_stop": {
          "tokenizer": "lowercase",
          "filter": [
            "english_stop"          
          ]
        }
      }
    }
  }
}

設置 stopwords 參數 指定過濾的停頓詞列表

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stop_analyzer": {
          "type": "stop",
          "stopwords": ["the", "over"]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_stop_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ quick, brown, foxes, jumped, lazy, dog, s, bone ]

6. Whitespace Analyzer

空格 分詞器, 顧名思義 遇到空格就進行分詞, 不會轉小寫

POST _analyze
{
  "analyzer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

[ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. ]

6.1 Definition

Tokenizer

  • Whitespace Tokenizer

6.2 Configuration

無配置

6.3 實驗

whitespace analyzer 的實現就是如下, 可以根據實際情況進行 添加 filter

PUT /whitespace_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_whitespace": {
          "tokenizer": "whitespace",
          "filter": [         
          ]
        }
      }
    }
  }
}

7. Keyword Analyzer

很特殊 它不會進行分詞, 怎麼輸入 就怎麼輸出

POST _analyze
{
  "analyzer": "keyword",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

//注意 這裏並沒有進行分詞 而是原樣輸出
[ The 2 QUICK Brown-Foxes jumped over the lazy dog's bone. ]

7.1 Definition

Tokennizer

  • Keyword Tokenizer

7.2 Configuration

無配置

7.3 實驗

rebuit 如下 就是 Keyword Analyzer 實現

PUT /keyword_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_keyword": {
          "tokenizer": "keyword",
          "filter": [         
          ]
        }
      }
    }
  }
}

8. Patter Analyzer

正則表達式 進行拆分 ,注意 正則匹配的是 標記, 就是要被分詞的標記 默認是 按照 \w+ 正則分詞

POST _analyze
{
  "analyzer": "pattern",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
// 默認是 按照 \w+ 正則
[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

8.1 Definition

Tokennizer

  • Pattern Tokenizer

Token Filters

  • Lower Case Token Filter
  • Stop Token Filter (默認未開啓)

8.2 Configuration

pattern A Java regular expression, defaults to \W+.
flags Java regular expression.
lowercase 轉小寫 默認開啓 true.
stopwords 停頓詞過濾 默認none 未開啓 , Defaults to _none_.
stopwords_path 停頓詞文件路徑

8.3 實驗

Pattern Analyzer 的實現 就是如下

PUT /pattern_example
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "split_on_non_word": {
          "type":       "pattern",
          "pattern":    "\\W+" 
        }
      },
      "analyzer": {
        "rebuilt_pattern": {
          "tokenizer": "split_on_non_word",
          "filter": [
            "lowercase"       
          ]
        }
      }
    }
  }
}

9. Language Analyzer

提供瞭如下 這麼多語言分詞器 , 其中 english 也在其中

arabic, armenian, basque, bengali, bulgarian, catalan, czech, dutch, english, finnish, french, galician, german, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, portuguese, romanian, russian, sorani, spanish, swedish, turkish.

GET _analyze
{
  "analyzer": "english",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
[ 2, quick, brown, foxes, jumped, over, lazy, dog, bone ]

10. Customer Analyzer

沒啥好說的 就是當提供的 內置分詞器不滿足你的需求的時候 ,你可以結合 如下3部分

  • Character Filters : 主要對原文本做處理, 例如 去除 html 標籤
  • Tokenizer : 按照規則 把文本切分爲單詞, 也就是分詞
  • Token Filters : 將切分後的單詞 進行加工處理, 小寫,刪除stopwords 停頓詞, 增加同義詞 , 擴展一些
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "char_filter": [
            "emoticons" 
          ],
          "tokenizer": "punctuation", 
          "filter": [
            "lowercase",
            "english_stop" 
          ]
        }
      },
      "tokenizer": {
        "punctuation": { 
          "type": "pattern",
          "pattern": "[ .,!?]"
        }
      },
      "char_filter": {
        "emoticons": { 
          "type": "mapping",
          "mappings": [
            ":) => _happy_",
            ":( => _sad_"
          ]
        }
      },
      "filter": {
        "english_stop": { 
          "type": "stop",
          "stopwords": "_english_"
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_custom_analyzer",
  "text":     "I'm a :) person, and you?"
}

[ i'm, _happy_, person, you ]

總結

本篇主要介紹了 Elasticsearch 中 的一些 內置的 Analyzer 分詞器, 這些內置分詞器可能不會常用,但是如果你能好好梳理一下這些內置 分詞器,一定會對你理解Analyzer 有很大的幫助, 可以幫助你理解 Character Filters , Tokenizer 和 Token Filters 的用處.

有機會再聊聊 一些中文分詞器 如 IKAnalyzer, ICU Analyzer ,Thulac 等等.. 畢竟開發中 中文分詞器用到更多些

歡迎大家訪問 個人博客 Johnny小屋
歡迎關注個人公衆號

歡迎關注個人公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章