1. 程式人生 > 程式設計 >999 - Elasticsearch Analysis 03 - Tokenizer

999 - Elasticsearch Analysis 03 - Tokenizer

Word Oriented Tokenizers

下面的tokenizer主要用來切分文字為單個單詞。

Standard Tokenizer

  • 預設的analyzer,適合大多數語言。
  • 根據Unicode Text Segmentation演演算法的定義,將文字切分成詞元。
  • 示例
POST _analyze
{
  "tokenizer": "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 ]

  • 配置引數
引數 說明
max_token_length 詞元的長度,超過會被分割。預設255。

示例

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },"tokenizer": {
        "my_tokenizer": {
          "type": "standard","max_token_length": 5
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer"
: "my_analyzer",jumpe,d,bone ]

Letter Tokenizer

  • 按非字母的切分。
  • 示例
POST _analyze
{
  "tokenizer": "letter",dog,s,bone ]

Lowercase Tokenizer

  • 相當於letter tokenizer+lowercase token filter
  • 示例
POST _analyze
{
  "tokenizer": "lowercase","text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
複製程式碼

產生[ the,quick,brown,foxes,bone ]

Whitespace Tokenizer

  • 按空格切分。
  • 示例
POST _analyze
{
  "tokenizer": "whitespace","text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
複製程式碼
  • 配置引數
引數 說明
max_token_length 詞元的長度,超過會被分割。預設255。

UAX URL Email Tokenizer

  • 類似standard tokenizer,只是能夠識別郵件地址、URL。
  • 示例
POST _analyze
{
  "tokenizer": "uax_url_email","text": "Email me at [email protected]"
}
複製程式碼

產生[ Email,me,at,[email protected] ]

如果是standard tokenizer將產生[ Email,john.smith,global,international.com ]

  • 配置引數
引數 說明
max_token_length 詞元的長度,超過會被分割。預設255。

示例

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },"tokenizer": {
        "my_tokenizer":{
          "type": "uax_url_email","text": "[email protected]"
}
複製程式碼

產生[ john,smith,globa,l,inter,natio,nal.c,om ]

Partial Word Tokenizers

這些Tokenizer主要將單詞或者文字擷取成更小的分段。

N-Gram Tokenizer

  • 指定保留的字元型別(通過引數token_chars指定,預設[]保留所有),以及根據min_gram以及max_gram指定切分時最小几個字元、最大幾個字元。

  • 像一個滑動視窗,例如min_gram為1,max_gram為3,對於Quick這個單詞,就會變成[ Q,Qu,Qui,u,ui,uic,i,ic,ick,c,ck,k ]。長度越短,切分出來越少,更多的被匹配到質量也越差;長度越長,切分出來越多,匹配越精確。

  • 示例

POST _analyze
{
  "tokenizer": "ngram","text": "Quick Fox"
}
複製程式碼

產生[ Q,k,"k "," "," F",F,Fo,o,ox,x ]

  • 配置引數
引數 說明
min_gram 字元的最小長度。預設為1。
max_gram 字元的最大長度。預設為2。
token_chars 字元組見下表。分詞時,保留指定的字元組,並根據沒有指定的字元組進行切分。例如指定了letter、digit字元組,就會根據whitespace、punctuation、symbol進行切分。
字元組 說明
letter 例如 a,b,ï or 京
digit 例如 3 or 7
whitespace 例如 " " or "\n"
punctuation 例如 ! or "
symbol 例如 $ or √

示例:保留數字,最小長度是1,最大是3。

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },"tokenizer": {
        "my_tokenizer":{
          "type": "ngram","min_gram": 1,"max_gram": 3,"token_chars": [
            "digit"
            ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer","text": "2 Quick Foxes."
}
複製程式碼

產生[ 2 ]

示例:保留數字和字母,最小最大長度都是3。因為數字2長度為1,小於3,所以結果中沒有數字,只剩下字母。

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },"tokenizer": {
        "my_tokenizer": {
          "type": "ngram","min_gram": 3,"token_chars": [
            "letter","digit"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer","text": "2 Quick Foxes."
}
複製程式碼

產生[ Qui,Fox,oxe,xes ]

Edge N-Gram Tokenizer

  • ngram tokenizer相同,只不過只從單詞頭開始。例如,min_gram為1,max_gram為3,對於Quick這個單詞,就會變成[ Q,Qui ]
  • 示例

預設配置:token_chars預設為[]保留全部,不拆分也就是Quick Fox作為一整個單詞,min_gram為1,max_gram為2

POST _analyze
{
  "tokenizer": "edge_ngram",Qu ]

配置示例

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },"tokenizer": {
        "my_tokenizer": {
          "type": "edge_ngram","min_gram": 2,"max_gram": 10,"text": "2 Quick Foxes."
}
複製程式碼

產生[ Qu,Quic,Quick,Foxe,Foxes ]

Structured Text Tokenizers

適用於結構化文字(例如郵箱、身份證等)

Keyword Tokenizer

  • 原模原樣不變。
  • 示例
POST _analyze
{
  "tokenizer": "keyword","text": "New York"
}
複製程式碼

產生[ New York ]

  • 配置引數
引數 說明
buffer_size 緩衝區大小。預設256。
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer":{
          "tokenizer": "my_tokenizer"
        }
      },"tokenizer": {
        "my_tokenizer": {
          "type": "keyword","buffer_size": 2
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer","text": "New York"
}
複製程式碼

產生[ New York ]

Pattern Tokenizer

  • 可以按照正則表示式切分,也可以按照正則表示式提取。

  • 示例

POST _analyze
{
  "tokenizer": "pattern","text": "The foo_bar_size's default is 5."
}
複製程式碼

產生[ The,foo_bar_size,default,is,5 ]

  • 配置引數
引數 說明
pattern 使用Java正則表示式。預設\W+
flags Java正則表示式flags,多個用|分離,例如"CASE_INSENSITIVE | COMMENTS"。
group 將哪個捕獲分組作為詞元。預設是 -1,相當於split。

Char Group Tokenizer

  • 根據定義的字元切分。
  • 配置引數
引數 說明
tokenize_on_chars 用來切分的字元。可以使用單個例如-,也可以使用字元組:whitespaceletterdigitpunctuationsymbol
POST _analyze
{
  "tokenizer": {
    "type": "char_group","tokenize_on_chars": [
      "whitespace","-"
    ]
  },"text": "The QUICK brown-fox"
}
複製程式碼

產生[ The,fox ]

Simple Pattern Tokenizer

  • 使用Lucene regular expressions捕獲文字,比pattern tokenizer受限(pattern tokenizer既可以捕獲又可以切分),但是更快。
  • 配置引數
引數 說明
pattern 使用Lucene regular expressions。預設空字串,不捕獲,輸出空條件。
POST _analyze
{
  "tokenizer": {
    "type": "simple_pattern","pattern": "[0123456789]{2}"
  },"text": "fd-786-335-514-x"
}
複製程式碼

產生[ 78,33,51 ]

Simple Pattern Split Tokenizer

  • 使用Lucene regular expressions切分文字,比pattern tokenizer受限(pattern tokenizer既可以捕獲又可以切分),但是更快。
  • 配置引數
引數 說明
pattern 使用Lucene regular expressions。預設空字串,不切分,整條輸出。
POST _analyze
{
  "tokenizer": {
    "type": "simple_pattern_split","pattern": "_"
  },"text": "an_underscored_phrase"
}
複製程式碼

產生[ an,underscored,phrase ]

Path Tokenizer

  • 切分類似檔案系統路徑的值。
  • 示例
POST _analyze
{
  "tokenizer": "path_hierarchy","text": "/one/two/three"
}
複製程式碼

產生[ /one,/one/two,/one/two/three ]

  • 配置引數
引數 說明
delimiter 路徑分隔符。預設/
replacement 分割後用來替換的分隔符。預設與delimiter一致。
buffer_size 緩衝大小。預設1024
reverse true則從相反順序切分。預設fasle。例如,one/two/three預設情況下切分為[ one,one/two,one/two/three ],設為true,則結果為[ one/two/three,two/three,three ]
skip 跳過多少個。預設0
POST _analyze
{
  "tokenizer": {
    "type": "path_hierarchy","delimiter": "-","replacement": "/","skip": 2
  },"text": "one-two-three-four-five"
}
複製程式碼

產生[ /three,/three/four,/three/four/five ]

設定reversetrue,產生[ one/two/three/,two/three/,three/ ]