字符过滤器(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 版权声明:本文为博主原创文章,转载请附上博文链接!