ES学习记录10.3——ES分析器4(字符过滤器)

主宰稳场 提交于 2019-12-07 03:04:34

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!