02.analyzer-tokenizer
文章目錄
- 1. elasticsearch tokenizers
- 1.es自帶的tokenizer 概覽
- 2. 自帶tokenizer詳解
- 1. Standard Tokenizer
- 2. Letter Tokenizer
- 3. Lowercase Tokenizer
- 4. Whitespace Tokenizer
- 5. UAX URL Email Tokenizer
- 6. Classic Tokenizer
- 7. Thai Tokenizer
- 8. N-Gram Tokenizer
- 9. Edge N-Gram Tokenizer
- 10. Keyword Tokenizer
- 11. Pattern Tokenizer
- 12. Simple Pattern Tokenizer
- 13. Char Group Tokenizer
- 14. Simple Pattern Split Tokenizer
- 15. Path Tokenizer
1. elasticsearch tokenizers
??tokenizer的輸入是character filter 處理過(guò)的字符,是analyzer的第二步,他的功能是根據(jù)一定的規(guī)則或者詞庫(kù)進(jìn)行分詞,將text切成一個(gè)一個(gè)獨(dú)立的token /term (詞),輸出是一個(gè)詞的流token stream。舉例來(lái)說(shuō) 一個(gè) whitespacetokenizer 會(huì)用空格作為分詞的邊界。
??同時(shí),tokenizer 還需要記錄每個(gè)term之間的順序,該term在token流中以term為單位的offset,以及每個(gè)term在輸入的character中的offset數(shù)據(jù),就是當(dāng)前term的開頭對(duì)應(yīng)了第幾個(gè)character。每一個(gè)analyzer有且只能有一個(gè)tokenizer。
本文主要介紹elasticsearch自帶的tokenizer,很多插件也提供了很多其他的tokenizers 。
1.es自帶的tokenizer 概覽
1.Standard Tokenizer
標(biāo)準(zhǔn)分詞器將文本劃分為單詞邊界上的術(shù)語(yǔ),這由Unicode文本分段算法定義。它刪除大多數(shù)標(biāo)點(diǎn)符號(hào)。這是大多數(shù)語(yǔ)言的最佳選擇。
2.Letter Tokenizer
字母分詞器在遇到非字母字符時(shí)會(huì)將文本分為多個(gè)術(shù)語(yǔ)。
3.Lowercase Tokenizer
小寫分詞器與字母分詞器一樣,在遇到非字母的字符時(shí),會(huì)將文本分為多個(gè)詞,但所有詞都小寫。
4.Whitespace Tokenizer
每當(dāng)遇到任何空白字符時(shí),空格tokenizer都會(huì)將文本劃分為多個(gè)term。
5.UAX URL Email Tokenizer
uax_url_email tokenizer 類似于standard tokenizer,不同之處在于它將URL和電子郵件地址識(shí)別為單個(gè)token。
6.Classic Tokenizer
經(jīng)典的分詞器是用于英語(yǔ)的基本語(yǔ)法的分詞器。
7.Thai Tokenizer
泰語(yǔ)分詞器將泰語(yǔ)文本分成單詞。
8.N-Gram Tokenizer
這個(gè)tokenizer比較特殊,對(duì)于查詢不使用空格或長(zhǎng)單詞的語(yǔ)言(例如德語(yǔ))很有用。
他會(huì)首先按照一定的規(guī)則進(jìn)行分詞,然后對(duì)每個(gè)詞輸出一個(gè)n-gram,就是類似把單詞做了一個(gè)滑窗處理一樣。
9.Edge N-Gram Tokenizer
作用類似n-gram,只是返回的分詞結(jié)果是n-gram的一部分,他要求必須是從token的開頭算起的n個(gè)char
10.Keyword Tokenizer
關(guān)鍵字分詞器是一個(gè)“空”標(biāo)記器,它接受給出的任何文本,并輸出與輸入完全相同的文本作為token。它可以與token filter (如lowercase)組合以對(duì)分析的術(shù)語(yǔ)進(jìn)行歸一化。
11.Pattern Tokenizer
模式分詞器使用正則表達(dá)式在與單詞分隔符匹配時(shí)將文本拆分為多個(gè)token,或?qū)⑵ヅ涞奈谋静东@為token。
12.Simple Pattern Tokenizer
simple_pattern 分詞器使用正則表達(dá)式捕獲匹配的文本作為term。它使用正則表達(dá)式功能的受限子集,并且通常比模式分詞器更快。
13.Char Group Tokenizer
char_group分詞器可通過(guò)分割字符集進(jìn)行配置,通常比運(yùn)行正則表達(dá)式輕量。
14.Simple Pattern Split Tokenizer
simple_pattern_split分詞器使用與simple_pattern分詞器相同的受限正則表達(dá)式子集,但是匹配的部分用來(lái)拆分輸入,而不是將匹配部分作為結(jié)果返回。
15.Path Tokenizer
路徑分詞器path_hierarchy分詞器采用類似于文件系統(tǒng)路徑的分層值,在路徑分隔符上拆分,并為樹中的每個(gè)組件產(chǎn)生一個(gè)term,例如/foo/bar/baz -> [/foo,/foo/bar,/foo/bar/baz]。
2. 自帶tokenizer詳解
1. Standard Tokenizer
標(biāo)準(zhǔn)分詞器將文本劃分為單詞邊界上的術(shù)語(yǔ),這由Unicode文本分段算法定義。它刪除大多數(shù)標(biāo)點(diǎn)符號(hào)。這是大多數(shù)語(yǔ)言的最佳選擇。unicode的語(yǔ)法定義看 這里
可配置的屬性
max_token_length : 標(biāo)識(shí)token的最大長(zhǎng)度,超過(guò)這個(gè)長(zhǎng)度的token將會(huì)按照長(zhǎng)度切分。
樣例
PUT /my_index?pretty {"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "standard","max_token_length": 6}}}} }POST /my_index/_analyze?pretty {"analyzer": "my_analyzer","text": "2 QUICKLY Brown-Foxes \u0027s " }返回{"tokens" : [{"token" : "2","start_offset" : 0,"end_offset" : 1,"type" : "<NUM>","position" : 0},{"token" : "QUICKL","start_offset" : 2,"end_offset" : 8,"type" : "<ALPHANUM>","position" : 1},{"token" : "Y","start_offset" : 8,"end_offset" : 9,"type" : "<ALPHANUM>","position" : 2},{"token" : "Brown","start_offset" : 10,"end_offset" : 15,"type" : "<ALPHANUM>","position" : 3},{"token" : "Foxes","start_offset" : 16,"end_offset" : 21,"type" : "<ALPHANUM>","position" : 4},{"token" : "s","start_offset" : 23,"end_offset" : 24,"type" : "<ALPHANUM>","position" : 5}] }可以看到QUICKLY 被切開了,同時(shí) 2的type和其他的不一樣,2被識(shí)別成了數(shù)字。
這里的每個(gè)token元素還有幾個(gè)屬性
2. Letter Tokenizer
字母分詞器在遇到非英文字母字符時(shí)會(huì)將文本分為多個(gè)術(shù)語(yǔ)。
沒(méi)有可配置項(xiàng)
樣例
這個(gè)type又都變成了word了
3. Lowercase Tokenizer
小寫分詞器與字母分詞器一樣,在遇到非字母的字符時(shí),會(huì)將文本分為多個(gè)詞,但所有詞都小寫。
樣例
POST _analyze {"tokenizer": "lowercase","text": "The 2 QUICK Brown-Foxes " }{"tokens" : [{"token" : "the","start_offset" : 0,"end_offset" : 3,"type" : "word","position" : 0},{"token" : "quick","start_offset" : 6,"end_offset" : 11,"type" : "word","position" : 1},{"token" : "brown","start_offset" : 12,"end_offset" : 17,"type" : "word","position" : 2},{"token" : "foxes","start_offset" : 18,"end_offset" : 23,"type" : "word","position" : 3}] }可以看到和letter-tokenizer是一樣的。只是附加轉(zhuǎn)換成了小寫的形式。
4. Whitespace Tokenizer
每當(dāng)遇到任何空白字符時(shí),空白令牌生成器都會(huì)將文本劃分為多個(gè)術(shù)語(yǔ)。
可以有這個(gè)配置
max_token_length 同Standard Tokenizer
樣例
POST _analyze {"tokenizer": "whitespace","text": "The 2 QUICK Brown-Foxes " }返回 {"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}] }返回為[The, 2, QUICK, Brown-Foxes]
5. UAX URL Email Tokenizer
uax_url_email tokenizer 類似于standard tokenizer,不同之處在于它將URL和電子郵件地址識(shí)別為單個(gè)token。
可以有這個(gè)配置
max_token_length 同Standard Tokenizer
樣例
POST _analyze {"tokenizer": "uax_url_email","text": "Email me at john.smith@global-international.com" }返回 {"tokens" : [{"token" : "Email","start_offset" : 0,"end_offset" : 5,"type" : "<ALPHANUM>","position" : 0},{"token" : "me","start_offset" : 6,"end_offset" : 8,"type" : "<ALPHANUM>","position" : 1},{"token" : "at","start_offset" : 9,"end_offset" : 11,"type" : "<ALPHANUM>","position" : 2},{"token" : "john.smith@global-international.com","start_offset" : 12,"end_offset" : 47,"type" : "<EMAIL>","position" : 3}] }6. Classic Tokenizer
經(jīng)典的分詞器是用于英語(yǔ)的基于語(yǔ)法的分詞器。對(duì)于純英文的文檔分詞效果比較好。
可以有這個(gè)配置
max_token_length 同Standard Tokenizer
樣例
POST _analyze {"tokenizer": "classic","text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." }返回{"tokens" : [{"token" : "The","type" : "<ALPHANUM>",},{"token" : "2","type" : "<ALPHANUM>",},{"token" : "QUICK","type" : "<ALPHANUM>",},{"token" : "Brown","type" : "<ALPHANUM>",},{"token" : "Foxes","type" : "<ALPHANUM>",},{"token" : "jumped","type" : "<ALPHANUM>",},{"token" : "over","type" : "<ALPHANUM>",},{"token" : "the","type" : "<ALPHANUM>",},{"token" : "lazy","type" : "<ALPHANUM>",},{"token" : "dog's","type" : "<APOSTROPHE>",},{"token" : "bone","type" : "<ALPHANUM>",}] }為了看著更方便,刪掉了start_offset,end_offset,position三個(gè)屬性,這里可以看到不同的tokenizer識(shí)別出來(lái)的type還有有很大的區(qū)別的
7. Thai Tokenizer
泰語(yǔ)分詞器將泰語(yǔ)文本分成單詞。
估計(jì)對(duì)我們這個(gè)使用很少
樣例
8. N-Gram Tokenizer
這個(gè)tokenizer比較特殊,對(duì)于查詢不使用空格或長(zhǎng)單詞的語(yǔ)言(例如德語(yǔ))很有用。
他會(huì)首先按照一定的規(guī)則進(jìn)行分詞,然后對(duì)每個(gè)詞輸出一個(gè)n-gram,就是類似把單詞做了一個(gè)滑窗處理一樣。
樣例
有三個(gè)屬性可以設(shè)置
min_gram:默認(rèn)為1 滑窗內(nèi)字符串最短數(shù)量
max_gram:默認(rèn)為2 滑窗內(nèi)字符串最長(zhǎng)數(shù)量
token_chars:term包含的字符,那些不屬于這里的字符用來(lái)分詞產(chǎn)生term,默認(rèn)token_chars是所有的字符,整個(gè)輸入作為一個(gè)term
復(fù)雜一些的樣例
PUT analyze_test {"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "n_tokenizer"}},"tokenizer": {"n_tokenizer": {"type": "ngram","min_gram": 5,"max_gram": 5,"token_chars": ["letter","digit"]}}}} }POST analyze_test/_analyze {"analyzer": "my_analyzer","text": ["i like beautiful scenery"] } 返回的token ["beaut"," eauti"," autif"," utifu"," tiful"," scene"," cener"," enery"]因?yàn)樽址?的長(zhǎng)度小于3,所以不會(huì)被輸出,假如是下面的
POST my_index/_analyze {"analyzer": "my_analyzer","text": "212 Quick Foxes." }返回
[ 212, Qui, uic, ick, Fox, oxe, xes ]
9. Edge N-Gram Tokenizer
作用類似n-gram,只是返回的分詞結(jié)果是n-gram的一部分,他要求必須是從token的開頭算起的n個(gè)char
有三個(gè)屬性可以設(shè)置
min_gram:默認(rèn)為1
min_gram:默認(rèn)為2
token_chars:term包含的字符,哪些不屬于這里的字符用來(lái)分詞產(chǎn)生term,默認(rèn)token_chars是所有的字符,整個(gè)輸入作為一個(gè)term
樣例
可以看到這里的每一個(gè)term都是取前綴的操作,而且長(zhǎng)度小于5的直接就會(huì)被忽略掉了
10. Keyword Tokenizer
關(guān)鍵字分詞器是一個(gè)“空”標(biāo)記器,它接受給出的任何文本,并輸出與輸入完全相同的文本作為token。它可以與token filter (如lowercase)組合以對(duì)分析的術(shù)語(yǔ)進(jìn)行歸一化。
樣例
注意,這里沒(méi)有逗號(hào) ,所以是一個(gè)詞,這個(gè)詞包含空格
11. Pattern Tokenizer
模式分詞器使用正則表達(dá)式在與單詞分隔符匹配時(shí)將文本拆分為多個(gè)token,或?qū)⑵ヅ涞奈谋静东@為token。
有三個(gè)屬性
pattern:正則表達(dá)式
flag: java flags,“CASE_INSENSITIVE|COMMENTS”
group: 是獲取group作為token還是把匹配的字符串作為split,默認(rèn)為-1,split
樣例
curl -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d' {"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "pattern","pattern": ","}}}} } ' curl -X POST "localhost:9200/my_index/_analyze?pretty" -H 'Content-Type: application/json' -d' {"analyzer": "my_analyzer","text": "comma,separated,values" } '返回 [ comma, separated, values ]12. Simple Pattern Tokenizer
simple_pattern 分詞器使用正則表達(dá)式捕獲匹配的文本作為term。它使用正則表達(dá)式功能的受限子集,并且通常比模式分詞器更快。
只有一個(gè)屬性
pattern
樣例
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "simple_pattern","pattern": "[0123456789]{3}"}}}} } POST my_index/_analyze {"analyzer": "my_analyzer","text": "fd-786335-514-x" }返回 [ 786, 335, 514 ]13. Char Group Tokenizer
char_group分詞器可通過(guò)分割字符集進(jìn)行配置,通常比運(yùn)行正則表達(dá)式輕量。
屬性
tokenize_on_chars:
14. Simple Pattern Split Tokenizer
simple_pattern_split分詞器使用與simple_pattern分詞器相同的受限正則表達(dá)式子集,但是匹配的部分用來(lái)拆分輸入,而不是將匹配部分作為結(jié)果返回。
屬性
pattern:用來(lái)做split的正則
15. Path Tokenizer
路徑分詞器path_hierarchy分詞器采用類似于文件系統(tǒng)路徑的分層值,在路徑分隔符上拆分,并為樹中的每個(gè)組件產(chǎn)生一個(gè)term,例如/foo/bar/baz -> [/foo,/foo/bar,/foo/bar/b
POST _analyze {"tokenizer": "path_hierarchy","text": "/one/two/three" }返回 [ /one, /one/two, /one/two/three ]總結(jié)
以上是生活随笔為你收集整理的02.analyzer-tokenizer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 01.analyzer简介及char_f
- 下一篇: mac安装hadoop2-client