字符過濾器(Character filters)用於在將字符流傳遞給標記生成器Tokenizer以前對其進行預處理,它負責將最原始的文本做爲字符流進行接受,能夠對經過添加、移除或改變字符的方式改變流。好比一個字符過濾器能夠用來轉換印度-阿拉伯數字٠١٢٣٤٥٦٧٨٩變成等價的阿拉伯語數字0123456789,或者從流中刪除<b>這樣的HTML元素。ES有不少內置的字符過濾器,能夠用於自定義的分析器中,主要有:html
HTML Strip Character Filter:html_strip字符過濾器能夠將流中的相似於<b>這樣的HTML標籤元素移除,並對HTML中相似於&這樣的實體進行解碼;
Mapping Character Filter:mapping字符過濾器(映射字符過濾器)使用指定的替換字符替換指定字符串的任何出現的內容;
Pattern Replace Character Filter:pattern_replace字符過濾器將與正則表達式匹配的任何字符替換爲指定的替換內容;
1. html標籤字符過濾器(HTML Strip Char Filter)
html_strip字符過濾器從文本中刪除HTML元素,並用其解碼值替換HTML實體(如用&替換&,在HTML語言中&就是表示&),如:java
curl -X POST "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
"tokenizer": "keyword",
"char_filter": [ "html_strip" ],
"text": "<p>I'm so <b>happy</b>!</p>"
}
'
1
2
3
4
5
6
7
返回的結果爲[\nI'm so happy!\n],其中將HTML中的<p>轉換爲\n,將'轉換爲'。html_strip字符過濾器是可配置的,接受的參數有:正則表達式
escaped_tags:表示一個包含HTML標籤元素的列表(刪除的HTML元素時,就將原始文本中出現的元素和這個列表中元素對比,若是是HTML元素且在該參數指定的列表中出現則保留,不然就移除);
下面是栗子:json
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"char_filter": ["my_char_filter"]
}
},
"char_filter": {
"my_char_filter": {
"type": "html_strip",
// 配置不移除的HTML標籤
"escaped_tags": ["b"]
}
}
}
}
}
'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
而後用上述的分析器my_analyzer分析文本<p>I'm so <b>happy</b>!</p>獲得的結果爲:[\nI'm so <b>happy</b>!\n]。數組
2. 映射字符過濾器(Mapping Char Filter)
mapping字符過濾器接受key-value這樣鍵-值對形式的映射,只要映射字符過濾器遇到映射表中key就將它替換成相應的value。在匹配key時是採用貪婪匹配,在給定點處的最長模式匹配獲勝,替換的字符串容許爲空字符串(即key對應的value值能夠爲空字符串)。mapping字符過濾器是可配置的,可接受的參數有:app
mappings:是一個映射的數組,每一個元素都是key => value鍵值對形式;
mappings_path:表示一個包含上述mappings中key => value內容的UTF-8編碼的文件路徑(能夠是絕對路徑或相對ES配置文件config的路徑,注意若是是這中文件方式,那麼一行只能有一個key => value鍵值對);
【注】上述兩個參數必須有且僅有一個,不像別的參數無關緊要。curl
下面是栗子:編碼
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"char_filter": [
"my_char_filter"
]
}
},
"char_filter": {
"my_char_filter": {
"type": "mapping",
"mappings": [
"٠ => 0",
"١ => 1",
"٢ => 2",
"٣ => 3",
"٤ => 4",
"٥ => 5",
"٦ => 6",
"٧ => 7",
"٨ => 8",
"٩ => 9"
]
}
}
}
}
}
'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
用上述的分析器my_analyzer分析文本My license plate is ٢٥٠١٥,最後獲得的結果爲[My license plate is 25015]。url
3. 模式替換字符過濾器(Pattern Replace Char Filter)
pattern_replace字符過濾器使用正則表達式去匹配原始文本中的字符,而後用指定的字符去替換匹配上的字符。替換字符串能夠引用正則表達式中的捕獲內容。pattern_replace字符過濾器是可配置的,可接受的參數有:.net
pattern:一個Java正則表達式,必選參數;
replacement:用於替換在原始文本中匹配上的內容,能夠引用匹配的內容(使用$1..$9的形式引用正則匹配上的第1處…第9處內容);
flags:java正則表達式中的標誌,標誌應該是管道分開的,好比CASE_INSENSITIVE|COMMENTS;
下面是栗子:
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d' { "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "standard", "char_filter": [ "my_char_filter" ] } }, "char_filter": { "my_char_filter": { "type": "pattern_replace", "pattern": "(\\d+)-(?=\\d)", "replacement": "$1_" } } } } } ' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 上述配置的正則表示是(\\d+)-(?=\\d),將匹配的內容替換爲正則表達式中匹配的第一處內容,那該分析器分析文本My credit card is 123-456-789獲得的結果爲[My, credit, card, is, 123_456_789]。