ES学习记录10.2——ES分析器3(标记过滤器)
?作為分析器三大組成部分的另一部分,標(biāo)記過濾器(token filters)是非必要的。token filters從標(biāo)記生成器tokenizer那里接受標(biāo)記輸入流,可以用來修改(如將術(shù)語轉(zhuǎn)成小寫)、刪除(如移除段詞)或添加(如同義詞)token。ES提供給了很多內(nèi)置的標(biāo)記過濾器,這些標(biāo)記過濾器可以在自定義的分析器中使用。
1. 標(biāo)準(zhǔn)標(biāo)記過濾器(Standard Token Filter)
?standard標(biāo)記過濾器標(biāo)準(zhǔn)化使用標(biāo)準(zhǔn)標(biāo)記生成器提取的標(biāo)記。目前standard標(biāo)記過濾器啥事兒都沒干,如果需要在將來的版本中添加某些過濾功能,它仍然是占位符。
2. ASCII碼折疊標(biāo)記過濾器(ASCII Folding Token Filter)
?這標(biāo)記過濾器名字翻譯的怪怪的,asciifolding過濾器將ASCII碼不在ASCII表前127內(nèi)的字母、數(shù)字和Unicode符號轉(zhuǎn)換為ASCII等效字符(如果存在的話)。比如:
curl -X PUT "localhost:9200/asciifold_example" -H 'Content-Type: application/json' -d' {"settings" : {"analysis" : {"analyzer" : {"default" : {"tokenizer" : "standard","filter" : ["standard", "asciifolding"]}}}} } '?asciifolding過濾器是可配置的,可接受的參數(shù)有:
- preserve_original:表示是否保留原始標(biāo)記以及輸出折疊的標(biāo)記,默認(rèn)為false;
下面是栗子:
curl -X PUT "localhost:9200/asciifold_example" -H 'Content-Type: application/json' -d' {"settings" : {"analysis" : {"analyzer" : {"default" : {"tokenizer" : "standard","filter" : ["standard", "my_ascii_folding"]}},"filter" : {"my_ascii_folding" : {"type" : "asciifolding","preserve_original" : true}}}} } '在將preserve_original設(shè)置為false后,然后分析文本?????時(shí)并沒有轉(zhuǎn)換成相應(yīng)的ASCII碼,返回來的標(biāo)記還是?????(待解決)。
3. Flatten Graph Token Filter
注:Lucene中將Flatten Graph Token Filter標(biāo)記為實(shí)驗(yàn)性功能。
4. 長度標(biāo)記過濾器(Length Token Filter)
?length標(biāo)記過濾器會移除token流中太長或太短的標(biāo)記,它是可配置的,接受的參數(shù)有:
- min:表示最小數(shù)值,默認(rèn)為0;
- max:表示最大數(shù)值,默認(rèn)為Integer.MAX_VALUE,即2147483647(2^31-1);
5. 小寫標(biāo)記過濾器(Lowercase Token Filter)
?lowercase標(biāo)記過濾器將標(biāo)記token規(guī)范化為小寫,它通過language參數(shù)支持希臘語、愛爾蘭語和土耳其語小寫標(biāo)記過濾器,下面是栗子:
curl -X PUT "localhost:9200/lowercase_example" -H 'Content-Type: application/json' -d' {"settings": {"analysis": {// 自定義2個(gè)分析器"analyzer": {// 標(biāo)準(zhǔn)分析器"standard_lowercase_example": {"type": "custom","tokenizer": "standard","filter": ["lowercase"]},// 希臘語分析器"greek_lowercase_example": {"type": "custom","tokenizer": "standard","filter": ["greek_lowercase"]}},"filter": {"greek_lowercase": {"type": "lowercase","language": "greek"}}}} } '看到這才知道索引中可以直接放分析器,而不用放文檔……所以自定義的分析器的時(shí)候可以這么搞。
6. 大寫標(biāo)記過濾器(Uppercase Token Filter)
和lowercase類似,只是將術(shù)語轉(zhuǎn)寫成大寫,參見上一小節(jié)。
7. NGram 標(biāo)記過濾器(Ngram Token Filter)
?nGram標(biāo)記過濾器,可配置,接受的參數(shù)有:
- min_gram:連詞最小長度,默認(rèn)為1;
- max_gram:連詞最大長度,默認(rèn)為2;
索引級別可以使用index.max_ngram_diff參數(shù)控制max_gram-min_gram的最大差值,覺得有些雞肋,如果標(biāo)記生成器可以設(shè)置這些參數(shù),還要在標(biāo)記過濾器中設(shè)置個(gè)啥。
8. Edge NGram 標(biāo)記過濾器(Edge Ngram Token Filter)
?edgeNGram標(biāo)記過濾器(只是錨定首字符)可配置,接受的參數(shù)有:
- min_gram:連詞的最小長度,默認(rèn)為1;
- max_gram:連詞的最大長度,默認(rèn)為2;
- side:已棄用;
9. Porter Steam Token Filter
?porter_stem標(biāo)記過濾器根據(jù)Porter詞干分析算法轉(zhuǎn)換標(biāo)記流。需要注意的是,給porter_stem標(biāo)記過濾器的流必須已經(jīng)轉(zhuǎn)換成小寫的,所以必須在之前使用小寫標(biāo)記生成器或小寫標(biāo)記過濾器(文檔中將這個(gè)預(yù)處理操作置于Tokenizer鏈的下方)。比如當(dāng)使用自定義的分析器時(shí),確保lowercase標(biāo)記過濾器位于過濾器列表中的porter_stem標(biāo)記過濾器之前。
10. Shingle Token Filter
?shingle標(biāo)記過濾器將標(biāo)記流構(gòu)造帶狀,換而言之,它用單個(gè)標(biāo)記創(chuàng)建了混合標(biāo)記,比如please divide this sentence into shingles可以被標(biāo)記為please divide、divide this、this sentence、sentence into和into shingles。shingle標(biāo)記過濾器通過插入填充標(biāo)記(使用帶有下劃線_的術(shù)語文本)來處理> 1的位置增量,它不處理位置增量為0的情況,這個(gè)過濾器是可配置的,接受參數(shù)有:
- max_shingle_size:shingle的最大大小,默認(rèn)為2;
- min_shingle_size:shingle的最小大小,默認(rèn)為2;
- output_unigrams:表示輸出是否包含輸入標(biāo)記以及shingles,默認(rèn)為true;
- output_unigrams_if_no_shingles:如果output_unigrams是false,如果沒有可獲取的shingles輸出將會包含輸入的標(biāo)記(單字組);注意如果output_unigrams是true,那output_unigrams_if_no_shingles參數(shù)設(shè)置就沒有意義,默認(rèn)為false;
- token_separator:表示連接相鄰標(biāo)記以形成shingle時(shí)使用的字符串,默認(rèn)為空格;
- filler_token:表示用于替換流中沒有實(shí)際標(biāo)記的每個(gè)位置的字符串。例如,當(dāng)stop過濾器與shingle過濾器一起使用時(shí),如果位置增量大于1,則使用該參數(shù)設(shè)置的字符串,默認(rèn)為_;
?索引級別可設(shè)置index.max_shingle_diff參數(shù)以控制max_shingle_size和min_shingle_size兩者之間的差值。
11. 段詞標(biāo)記過濾器(Stop Token Filter)
?stop類型標(biāo)記過濾器可以將段詞從標(biāo)記流中移除,它是可配置的,接受的參數(shù)有:
- stopwords:一個(gè)包含段詞的數(shù)組,默認(rèn)是_english_(內(nèi)置的英語段詞);
- stopwords_path:一個(gè)段詞配置文件的路徑((相對于ES的配置文件config的位置,或直接寫成絕對路徑),每個(gè)段詞應(yīng)該在自己的“行”中(使用“行”進(jìn)行分割),段詞配置文件必須是UTF-8編碼類型;
- ignore_case:設(shè)置為true以首先小寫所有單詞,默認(rèn)為false;
- remove_trailing:將其設(shè)置為false以不忽略搜索的最后一個(gè)術(shù)語(如果最后一個(gè)術(shù)語是段詞的話),這對于完整的suggester在搜索時(shí)非常有用的(即使基本移除段詞,像green a還是可以被擴(kuò)展為green apple的),默認(rèn)為true;
下面是栗子:
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d' {"settings": {"analysis": {"filter": {"my_stop": {"type": "stop","stopwords": ["and", "is", "the"]}}}} } '上述是自定義了段詞為and、is和the就這三個(gè),ES也內(nèi)置了很多了段詞,比如_english_就是其中一種(收錄了常用英語段詞),當(dāng)然除此之外還有很多:_arabic_, _armenian_, _basque_, _bengali_, _brazilian_, _bulgarian_, _catalan_, _czech_, _danish_, _dutch_, _english_, _finnish_, _french_, _galician_, _german_, _greek_, _hindi_, _hungarian_, _indonesian_, _irish_, _italian_, _latvian_, _norwegian_, _persian_, _portuguese_, _romanian_, _russian_, _sorani_, _spanish_, _swedish_, _thai_, _turkish_,挑著用,如果不像移除任何段詞,即為空,需要將stopwords指定為\_none_。
12. 單詞分隔符標(biāo)記過濾器(Word Delimiter Token Filter)
?word_delimiter標(biāo)記過濾器將單詞拆分為子詞并對子詞組執(zhí)行可選的轉(zhuǎn)換,將單詞分割為子單詞需要遵守下面的原則:
- 直接按自帶的分隔符分割(默認(rèn)將所有非字母、數(shù)字字符看作分隔符,如WI-FI–>WI和FI);
- 按大小寫轉(zhuǎn)換分割(即駝峰分割,比如PowerShot–>Power和Shot);
- 按字母、數(shù)字分割(如SD500–>SD和500);
- 忽略每個(gè)子字上的前導(dǎo)和尾隨字的內(nèi)分隔符(如//hello---there, dude → hello、there、dude);
- 每個(gè)子詞都刪除尾隨的's(如O’Neil’s → O、Neil);
word_delimiter標(biāo)記過濾器是可配置的,接受的參數(shù)有:
- generate_word_parts:表示是否分割單詞,默認(rèn)為true(就是是否分割單詞為子詞,如PowerShot–>Power和Shot);
- generate_number_parts:表示是否分割數(shù)字,默認(rèn)為true(如500-42–>500、42);
- catenate_words:表示是否將單詞部件的大部分被連接(如:wi-fi–>wi、fi),默認(rèn)為false;
- catenate_numbers:表示是否將數(shù)字部件的最大運(yùn)行被連接(如:500-42–>50042),默認(rèn)為false;
- catenate_all:表示是否將所有分割得到的子詞連接起來(如:"wi-fi-4000–>wifi4000),默認(rèn)為false;
- split_on_case_change:表示是否在大、小寫轉(zhuǎn)換處分割(如PowerShot–>Power、Shot),默認(rèn)為true;
- preserve_original:表示是否分割的結(jié)果是否將原始文本包含在里面(如500-42–>500、42、500-42),默認(rèn)為false;
- split_on_numerics:表示是否在數(shù)字處分割(如j2se–>j、2、se),默認(rèn)為true;
- stem_english_possessive:表示是否為每個(gè)子字刪除尾隨的's,默認(rèn)為true;
高級可選參數(shù):
- protected_words:表示一個(gè)包含受保護(hù)的單詞不是分隔符的列表,可以是一個(gè)數(shù)組[xx, xx],也可以設(shè)置protected_words_path,即配置了受保護(hù)字的文件(每行一個(gè))路徑,如果存在,則自動(dòng)解析為基于ES的配置文件config/的位置路徑;
- type_table:表示一個(gè)自定義的類型映射,比如當(dāng)使用type_table_path配置時(shí):
注:當(dāng)使用standard標(biāo)記過濾器時(shí)可能會干擾catenate_*和preserve_original參數(shù),因?yàn)樵嫉淖址赡茉跇?biāo)記生成器中生成token的過程中丟失了標(biāo)點(diǎn)符號,這種情況應(yīng)該考慮使用whitespace標(biāo)記生成器。
【注】
后續(xù)還有很多標(biāo)記過濾器,用到的時(shí)候可以參考研讀Token Filter。
總結(jié)
以上是生活随笔為你收集整理的ES学习记录10.2——ES分析器3(标记过滤器)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 垃圾回收与垃圾收集算法
- 下一篇: 小程序获取带有分享者信息的小程序码