字符过滤器(Character filters)用于在将字符流传递给标记生成器Tokenizer之前对其进行预处理,它负责将最原始的文本作为字符流进行接受,可以对通过添加、移除或改变字符的方式改变流。比如一个字符过滤器可以用来转换印度-阿拉伯数字٠١٢٣٤٥٦٧٨٩变成等价的阿拉伯语数字0123456789,或者从流中删除<b>这样的HTML元素。ES有很多内置的字符过滤器,可以用于自定义的分析器中,主要有:
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语言中&就是表示&),如:
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元素且在该参数指定的列表中出现则保留,否则就移除);
下面是栗子:
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字符过滤器是可配置的,可接受的参数有:
mappings:是一个映射的数组,每个元素都是key => value键值对形式;
mappings_path:表示一个包含上述mappings中key => value内容的UTF-8编码的文件路径(可以是绝对路径或相对ES配置文件config的路径,注意如果是这中文件方式,那么一行只能有一个key => value键值对);
【注】上述两个参数必须有且仅有一个,不像别的参数可有可无。
下面是栗子:
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]。
3. 模式替换字符过滤器(Pattern Replace Char Filter)
pattern_replace字符过滤器使用正则表达式去匹配原始文本中的字符,然后用指定的字符去替换匹配上的字符。替换字符串可以引用正则表达式中的捕获内容。pattern_replace字符过滤器是可配置的,可接受的参数有:
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]。
注:使用更改原始文本长度的替换字符串将用于搜索目的,但会导致突出显示不正确,详细参见Second example;
---------------------
作者:jacksonary
来源:CSDN
原文:https://blog.csdn.net/jacksonary/article/details/83902335
版权声明:本文为博主原创文章,转载请附上博文链接!