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 | 用來切分的字元。可以使用單個例如- ,也可以使用字元組:whitespace ,letter , digit , punctuation , symbol 。 |
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 ]
。
設定reverse
為true
,產生[ one/two/three/,two/three/,three/ ]
。