1. HTML strip character filter
- html_strip,从文本中剥离 HTML 元素并用其解码值替换HTML实体(例如,用 & 替换 &)。
- 可选参数:
| 参数 | 参数说明 |
| :—-: | :—-: |
| escaped_tags | (可选,字符串数组)不带尖括号(<>)的HTML元素数组。当从文本中剥离HTML时,过滤器将跳过这些HTML元素。例如,[“p”]值跳过
HTML元素。 |
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"char_filter": [
"my_custom_html_strip_char_filter"
]
}
},
"char_filter": {
"my_custom_html_strip_char_filter": {
"type": "html_strip",
"escaped_tags": [
"b"
]
}
}
}
}
}
GET my_index/_analyze
{
"analyzer": "my_analyzer",
"text" : "<p>I'm so <b>happy</b>!</p>"
}
#结果:[ \nI'm so <b>happy</b>!\n ]
2. Mapping character filter
- mapping,接受键和值的映射。每当遇到与键相同的字符串时,它会用与该键关联的值替换它们。
- 使用的贪婪匹配;
- 允许替换成空字符串;
- 可选参数:
- 必须指定此 mappings 或 mappings_path 参数
| 参数 | 参数说明 |
| :—-: | :—-: |
| mappings | (必需,字符串数组)映射数组,每个元素的格式为key=>value。 |
| mappings_path | (必需,字符串)包含键=>值映射的文件的路径。
此路径必须是相对于配置位置的绝对路径或相对路径,并且文件必须是UTF-8编码的。文件中的每个映射都必须用换行符分隔。 |
- 必须指定此 mappings 或 mappings_path 参数
| 参数 | 参数说明 |
| :—-: | :—-: |
| mappings | (必需,字符串数组)映射数组,每个元素的格式为key=>value。 |
| mappings_path | (必需,字符串)包含键=>值映射的文件的路径。
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_mappings_char_filter"
]
}
},
"char_filter": {
"my_mappings_char_filter": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
}
}
}
}
GET /my_index/_analyze
{
"tokenizer": "keyword",
"char_filter": [ "my_mappings_char_filter" ],
"text": "I'm delighted about it :("
}
#结果:[ I'm delighted about it _sad_ ]
3. Pattern replace character filter
- pattern_replace,使用正则表达式匹配应替换为指定替换字符串的字符;
- 替换字符串可以引用正则表达式中的捕获组。
- 使用 Java 正则表达式;
- 写得不好的正则表达式可能运行得非常慢,甚至会抛出 StackOverflowError 并导致运行它的节点突然退出。
可选参数: | 参数 | 参数说明 | | :—-: | :—-: | | pattern | Java 正则表达式 | | replacement | 替换字符串,它可以使用$1..$9语法引用捕获组 | | flags | Java 正则表达式中的 flags,例如 “CASE_INSENSITIVE|COMMENTS” |
举例:123-456-789 → 123_456_789 ```json
(?=pattern)正向肯定匹配,”Windows(?=95|98|NT|2000)”能匹配”Windows2000”中的”Windows”,
但不能匹配”Windows3.1”中的”Windows”。
PUT my_index { “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_"
}
}
} } }
POST my_index/_analyze { “analyzer”: “my_analyzer”, “text”: “My credit card is 123-456-789” }
结果:[ My, credit, card, is, 123_456_789 ]
- 使用替换字符串来更改原始文本的长度对于搜索来说是有效的,但是会导致不正确的高亮显示,如下例所示
- 此示例在遇到小写字母后跟大写字母时插入空格(即fooBarBaz→foo Bar Baz),允许单独查询camelCase单词
```json
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_char_filter"
],
"filter": [
"lowercase"
]
}
},
"char_filter": {
"my_char_filter": {
"type": "pattern_replace",
"pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
"replacement": " "
}
}
}
},
"mappings": {
"properties": {
"text": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
POST my_index/_analyze
{
"analyzer": "my_analyzer",
"text": "The fooBarBaz method"
}
#结果:[ the, foo, bar, baz, method ]
PUT my_index/_doc/1?refresh
{
"text": "The fooBarBaz method"
}
GET my_index/_search
{
"query": {
"match": {
"text": "bar"
}
},
"highlight": {
"fields": {
"text": {}
}
}
}
#高亮结果出错 Ba,因为 character filter 改变了原始文本的长度;
{
"highlight": {
"text": [
"The foo<em>Ba</em>rBaz method"
]
}
}