01.analyzer简介及char_filter组件
文章目錄
- 1. es的詞分析組件analyzer簡介
- 1.1 在index的時候如何選擇analyzer
- 1.1.1. 使用index mapping中對該filed進行analysis
- 1.1.2. default analyzer
- 1.1.3.使用standard ananlyzer
- 1.2 在search的時候如何選擇analyzer
- 1.2.1. 優(yōu)先使用在query中指定的analyzer
- 1.2.2. 使用index mapping中對該field定義的 search_analyzer
- 1.2.3. 使用mapping中field定義的analyzer
- 1.2.4. 使用index setting中定義的 名字為 default_search 的analyzer
- 1.2.5. 使用index setting中定義的名字為 default 的analyzer
- 2. analyzer的內(nèi)部結(jié)構(gòu)
- 3. character filters
- 1.HTML Strip Character Filter
- 1.html_strip字符過濾器功能
- 2.他也允許你配置忽略哪些標(biāo)簽,被忽略的標(biāo)簽將不會被刪除
- 2.Mapping Character Filter
- 3.Pattern Replace Character Filter
1. es的詞分析組件analyzer簡介
文檔在進行存儲之前,先要進行處理,同樣的,在查詢之前query也要進行處理,這些處理主要是分詞,去掉停用詞等信息,這些功能能都是由一個叫analyzer的組件來實現(xiàn)的。
1.1 在index的時候如何選擇analyzer
在進行index的時候,
1.首先會使用 index mapping中對該filed定義的analyzer進行analysis
2.當(dāng)對應(yīng)的field沒有定義對應(yīng)的analyzer的時候,會查找在定義index mapping的時候是否有定義對應(yīng)的 名字為 default的的analyzer
3.如果index的setting沒有配置 default analyzer,那么es會使用默認的standard analyzer進行處理
1.1.1. 使用index mapping中對該filed進行analysis
PUT my_index {"settings": {"analysis": {"analyzer": {"std_english": {"type": "standard","stopwords": "_english_"}}}},"mappings": {"properties": {"title": {"type": "text","analyzer": "std_english"}}} }像這樣在定義index的時候?qū)δ硞€字段定義了一個analyzer,那么在往這個indices中index數(shù)據(jù)的時候就會使用std_english analyzer.
1.1.2. default analyzer
當(dāng)對應(yīng)的field沒有定義對應(yīng)的analyzer的時候,會查找在定義index mapping的時候是否有定義對應(yīng)的 名字為 default的的analyzer
PUT my_index {"settings": {"analysis": {"analyzer": {"default": {"type": "simple"}}}} }這樣,在1沒有命中的話會默認使用default analyzer.
1.1.3.使用standard ananlyzer
如果index的setting沒有配置 default analyzer,那么es會使用默認的standard analyzer進行處理
At index time, if no analyzer has been specified, it looks for an analyzer in the index settings called default. Failing that, it defaults to using the standard analyzer.1.2 在search的時候如何選擇analyzer
在query查詢的時候也會使用analyzer對query進行分析處理,具體使用哪個analyzer也是有一定的選擇機制的。
注意,這個地方和最新的7.5的文檔敘述有出入,7.5中是3和4調(diào)換了一下位置
1.2.1. 優(yōu)先使用在query中指定的analyzer
GET my_index/_search {"query": {"match": {"message": {"query": "Quick foxes","analyzer": "stop"}}} }1.2.2. 使用index mapping中對該field定義的 search_analyzer
PUT my_index {"mappings": {"properties": {"title": {"type": "text","analyzer": "whitespace","search_analyzer": "simple"}}} }1.2.3. 使用mapping中field定義的analyzer
PUT my_index {"mappings": {"properties": {"title": {"type": "text","analyzer": "whitespace"}}} }1.2.4. 使用index setting中定義的 名字為 default_search 的analyzer
PUT my_index {"settings": {"analysis": {"analyzer": {"default": {"type": "simple"},"default_search": {"type": "whitespace"}}}} }1.2.5. 使用index setting中定義的名字為 default 的analyzer
PUT my_index {"settings": {"analysis": {"analyzer": {"default": {"type": "simple"}}}} }2. analyzer的內(nèi)部結(jié)構(gòu)
實際上analyzer是由三個部分構(gòu)成
character filter 的輸入是原始的文本text,然后他進行一些addding,removing,change characters 操作
tokenizer的輸入是character filter 處理過的字符,他的功能是根據(jù)一定的規(guī)則或者詞庫進行分詞,將text切成一個一個獨立的token /term (詞),輸出是一個詞的流token stream
token filter 這個名字也直接表達了含義,就是對token stream 進行了add ,remove, change操作
用戶可以使用者三個部分來自定義analyzer,在下面的部分我們會分別介紹這三個部分,character filters,tokenizers,token filters。
3. character filters
??character filter 的輸入是原始的文本text,然后他進行一些addding,removing,change characters 操作。比如將1,2,3,4轉(zhuǎn)成漢語中的一,二,三這種。一個analyzer可以沒有character,也可以有多個character filter。目前es自帶的character filter 有下面這些
1.HTML Strip Character Filter
1.html_strip字符過濾器功能
從文本中剝離HTML元素,并用其解碼值替換HTML實體(例如,將&替換為&)。
在 HTML 中,某些字符是預(yù)留的。
在 HTML 中不能使用小于號(<)和大于號(>),這是因為瀏覽器會誤認為它們是標(biāo)簽。
如果希望正確地顯示預(yù)留字符,我們必須在 HTML 源代碼中使用字符實體(character entities)。 字符實體類似這樣:
&entity_name;
或
&#entity_number;
如需顯示小于號,我們必須這樣寫:< 或 < 或 <
樣例一
POST _analyze {"tokenizer": "keyword","char_filter": [ "html_strip" ],"text": "<p>I'm so & <b>happy</b>!</p>" }返回 {"tokens" : [{"token" : """ I'm so & happy! ""","start_offset" : 0,"end_offset" : 38,"type" : "word","position" : 0}] }2.他也允許你配置忽略哪些標(biāo)簽,被忽略的標(biāo)簽將不會被刪除
樣例
PUT my_index {"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "keyword","char_filter": ["my_char_filter"]}},"char_filter": {"my_char_filter": {"type": "html_strip","escaped_tags": ["b"]}}}} }POST my_index/_analyze {"analyzer": "my_analyzer","text": "<p>I'm so <b>happy</b>!</p>" }返回 {"tokens" : [{"token" : """ I'm so <b>happy</b>! ""","start_offset" : 0,"end_offset" : 32,"type" : "word","position" : 0}] }2.Mapping Character Filter
映射字符過濾器接受鍵和值的映射。每當(dāng)遇到與鍵相同的字符串時,它將用與該鍵關(guān)聯(lián)的值替換它們。
匹配是貪婪的;在給定點匹配的最長模式會獲勝。允許替換為空字符串。
所以mapping char_filter 不像html_strip那樣拆箱即可用,必須先進性配置才能使用mapping char_filter
mapping char_fliter有兩個屬性可以配置
1.mappings:數(shù)組類型,數(shù)組中的每一個元素都是key=>value
2.mappings_path: 一個path,用于使用文件存儲key=>value的情況
3.Pattern Replace Character Filter
pattern_replace字符過濾器使用正則表達式來匹配應(yīng)用指定的替換字符串替換的字符。替換字符串可以引用正則表達式中的捕獲組。
同樣 pattern_replace char_filter也是先配置后使用,有三個屬性
1.pattern: 一個java pattern
2.replacement: 被替換成的字符串
3.flags: java 正則的flag參數(shù) “CASE_INSENSITIVE|COMMENTS”
樣例
PUT my_index {"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "keyword","char_filter": ["my_char_filter"]}},"char_filter": {"my_char_filter": {"type": "pattern_replace","pattern": "(\\d+)-(?=\\d)","replacement": "$1_"}}}} }POST my_index/_analyze {"analyzer": "my_analyzer","text": "My credit card is 123-456-789" }改變了原來的文本有可能導(dǎo)致高亮有些問題,高亮位置顯示的有可能不對不對。
總結(jié)
以上是生活随笔為你收集整理的01.analyzer简介及char_filter组件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01.elasticsearch-sec
- 下一篇: 02.analyzer-tokenize