Elasticsearch從入門到放棄:分詞器初印象

點擊上方「藍字」關注咱們吧!

Elasticsearch 系列回來了,先給由於這個系列關注個人同窗說聲抱歉,拖了這麼久纔回來,這個系列雖然叫「Elasticsearch 從入門到放棄」,但只有三篇就放棄仍是有點過度的,因此仍是回來繼續更新。
html

以前咱們聊過了 Elasticsearch 的索引和文檔,不太熟悉的話能夠先翻閱一下前文。今天再一塊兒聊一下 Elasticsearch 的分詞器。web

關於分詞

若是你是講 Elasticsearch 做爲搜索引擎,那麼你應該須要對分詞進行了解,Elasticsearch 的分詞是將全文本轉換爲一系列單詞,這樣有助於在搜索時獲得相關的結果以及相關性分析。例如咱們有一個文本爲「I love Elasticsearch」,而後 Elasticsearch 能夠將其分解爲三個單詞,這時咱們不管搜索哪一個單詞,都能搜到這個文本。正則表達式

Elasticsearch 經過分詞器對文本進行分詞處理,Elasticsearch 的分詞器是由 Character Filters、Tokenizer 和Token Filter 三部分組成。在介紹它們以前,咱們先來簡單瞭解一下 Analyze API,它能夠幫助咱們快速測試一個  Analyzer 的做用,它的用法也很是簡單:微信

GET /_analyze
{
  "analyzer" : "standard",
  "text" : "Quick Brown Foxes!"
}

其中,analyzer 是指定的分詞器,text 是被測試的文本,這樣就能獲得這個文本分詞後的效果。app

這是最簡單的一種用法,此外,咱們還能夠在 path 中指定 index,用於測試指定索引中 mapping 設置的 analyzer 或者索引默認的 analyzer。固然,你也能夠測試一下自定義的 analyzer,只須要在參數中設置好 Character Filters、Tokenizer 和Token Filter 便可。關於 Analyze API 更多的使用方法能夠自行查閱官方文檔 Analyze APIelasticsearch

內置 Analyzer

爲了方便使用,Elasticsearch 爲咱們提供了幾種內置 Analyzer:編輯器

  • Fingerprint:它能夠將文本處理爲小寫的、去除擴展的、有序的、惟一的單詞測試

  • Keyword:不分詞flex

  • Language:提供了30多種常見語言的分詞器ui

  • Pattern:使用正則表達式分詞,默認\W+(非字符分隔)

  • Simple:按照非字母切分,小寫處理

  • Standard:默認分詞器,會基於 Unicode 文本語法,按照單詞劃分,並進行小寫處理

  • Stop:小寫處理,過濾停用詞(the, a, is)

  • Whitespace:按照空格切分,不轉小寫

如今咱們來測試一下 Whitespace Analyzer

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

它的執行結果是

{
  "tokens" : [
    {
      "token" : "The",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "2",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "QUICK",
      "start_offset" : 6,
      "end_offset" : 11,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "Brown-Foxes",
      "start_offset" : 12,
      "end_offset" : 23,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "jumped",
      "start_offset" : 24,
      "end_offset" : 30,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : "over",
      "start_offset" : 31,
      "end_offset" : 35,
      "type" : "word",
      "position" : 5
    },
    {
      "token" : "the",
      "start_offset" : 36,
      "end_offset" : 39,
      "type" : "word",
      "position" : 6
    },
    {
      "token" : "lazy",
      "start_offset" : 40,
      "end_offset" : 44,
      "type" : "word",
      "position" : 7
    },
    {
      "token" : "dog's",
      "start_offset" : 45,
      "end_offset" : 50,
      "type" : "word",
      "position" : 8
    },
    {
      "token" : "bone.",
      "start_offset" : 51,
      "end_offset" : 56,
      "type" : "word",
      "position" : 9
    }
  ]
}

若是有興趣,能夠自行測試一下其餘的內置 Analyzer。除了內置的 Analyzer 以外,你也能夠根據須要自定義分詞器。

下面咱們來看怎麼定義咱們須要的 Analyzer。

前面提到 Analyzer 由三部分組成,其中 Character Filters 用於對原始文本進行處理(例如去掉html標籤),Tokenizer 是按照指定規則進行切分,Token Filter 負責將切分的單詞進行加工(例如轉小寫)。

Character Filters

Character Filters 是分詞的第一步,Elasticsearch 用它來對原始文本進行一些處理。內置的 Character Filters 有三個,分別是:

  • HTML strip:使用解碼值替換HTML標籤

  • Mapping:使用指定的替換項替換指定的字符串

  • Pattern replace:使用指定的替換項替換正則匹配的字符串

HTML strip 默認會替換文本中全部的 HTML 標籤,你也能夠經過設置escaped_tags,將一些特定的標籤排除

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer""keyword",
          "char_filter": [
            "my_custom_html_strip_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_custom_html_strip_char_filter": {
          "type""html_strip",
          "escaped_tags": [
            "b"
          ]
        }
      }
    }
  }
}

這個自定義 Analyzer 就不會替換標籤 b。

Tokenizer

在對原始文本進行初步的處理以後,Tokenizer 就要上場了,它幫助咱們根據指定的規則進行分詞,Elasticsearch 一樣提供了一些內置的 Tokenizer。

  • Character group:按照配置的字符組進行切分

  • Classic:針對英語語法進行分詞

  • Edge n-gram:從單詞的起始字符開始按長度依次切分quick 會被分爲[q, qu, qui, quic, quick]

  • Keyword:不切分

  • Letter:遇到非字母的字符進行切分

  • Lowercase:與相似 Letter 相似,不過它會把切分後的單詞轉爲小寫

  • N-gram:把單詞切分爲指定長度的字符串集合,quick 會被分爲[qu, ui, ic, ck]

  • Path hierarchy:對路徑進行切分,/foo/bar/baz 會分爲[/foo, /foo/bar, /foo/bar/baz]

  • Pattern:根據正則匹配進行切分

  • Simple pattern:正則會受到一些限制,但不支持按照匹配到的分割符切分

  • Simple pattern split:是支持按照匹配到的分割符切分的Simple pattern

  • Standard:按照單詞進行切分

  • Thai:針對泰語進行切分

  • UAX URL email:與 Standard 類似,但它會把 url 或郵箱看成一個總體

  • Whitespace:按照空格進行切分

在這裏你能夠先對這些內置的 Tokenizer 有個初步的瞭解,知道它們能幹什麼,在具體使用的時候能夠查閱官方文檔進行更詳細的瞭解,不少 Tokenizer 還支持一些參數配置,這些到實際場景中靈活使用就好。

Token Filter

Elasticsearch 內置的 Token Filter 很是多,這裏列幾個經常使用的吧:

  • Trim:刪除先後空格

  • Uppercase:轉大寫

  • Lowercase:轉小寫

  • Stop:停用詞過濾

  • ……

Elasticsearch 中內置的這些分詞器及組件能夠知足咱們平常的大部分需求了,可以作到靈活應用就很厲害了。若是真的遇到解決不了的問題,你也能夠嘗試自定義分詞器,例如對咱們的中文進行分詞。

中文分詞

中文分詞的難點在於,它不像英文那樣有自然的空格能夠進行切分,咱們也不能簡單的把它分紅一個個的字,而是要分紅有意義的詞。

比較不錯的中文分詞器有 ICU Analyzer、IK 和 THULAC

ICU Analyzer

ICU Analyzer 並非 Elasticsearch 內置的分詞器,因此咱們須要預先安裝插件才能使用

執行命令

elasticsearch-plugin install analysis-icu

進行安裝,安裝好之後可使用命令elasticsearch-plugin list進行查看。

安裝好以後就能夠運行下面這個例子

GET _analyze
{
  "analyzer""standard"
  "text""以爲好看就點贊"
}

GET _analyze
{
  "analyzer""icu_analyzer"
  "text""以爲好看就點贊"
}

你會發現 standard analyzer 就是把這句話拆成一個個字,而 icu analyzer 基本會根據語義進行拆分。

總結

通過本文的介紹,相信你對 Elasticsearch 的分詞器也有了一個初步的認識,知道它由什麼組成,可以使用 Analyze API 對一個分詞器進行簡單的測試,也基本可以自定義一些分詞器了。

我對內置的 Token Filter 介紹的比較少,你能夠結合官方文檔,對你感興趣的 Token Filter 進行更深刻的研究,若是有什麼問題也歡迎和我討論。

往期精彩回顧
Elasticsearch從入門到放棄:文檔CRUD要牢記
Elasticsearch從入門到放棄:索引基本使用方法
Elasticsearch從入門到放棄:人生若只如初見

本文分享自微信公衆號 - 代碼潔癖患者(Jackeyzhe2018)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索