1. HTML strip character filter

  • html_strip,从文本中剥离 HTML 元素并用其解码值替换HTML实体(例如,用 &amp 替换 &)。
  • 可选参数: | 参数 | 参数说明 | | :—-: | :—-: | | escaped_tags | (可选,字符串数组)不带尖括号(<>)的HTML元素数组。当从文本中剥离HTML时,过滤器将跳过这些HTML元素。例如,[“p”]值跳过

    HTML元素。 |

  1. PUT my_index
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "keyword",
  8. "char_filter": [
  9. "my_custom_html_strip_char_filter"
  10. ]
  11. }
  12. },
  13. "char_filter": {
  14. "my_custom_html_strip_char_filter": {
  15. "type": "html_strip",
  16. "escaped_tags": [
  17. "b"
  18. ]
  19. }
  20. }
  21. }
  22. }
  23. }
  24. GET my_index/_analyze
  25. {
  26. "analyzer": "my_analyzer",
  27. "text" : "<p>I&apos;m so <b>happy</b>!</p>"
  28. }
  29. #结果:[ \nI'm so <b>happy</b>!\n ]

2. Mapping character filter

  • mapping,接受键和值的映射。每当遇到与键相同的字符串时,它会用与该键关联的值替换它们。
  • 使用的贪婪匹配;
  • 允许替换成空字符串;
  • 可选参数:
    • 必须指定此 mappings 或 mappings_path 参数 | 参数 | 参数说明 | | :—-: | :—-: | | mappings | (必需,字符串数组)映射数组,每个元素的格式为key=>value。 | | mappings_path | (必需,字符串)包含键=>值映射的文件的路径。
      此路径必须是相对于配置位置的绝对路径或相对路径,并且文件必须是UTF-8编码的。文件中的每个映射都必须用换行符分隔。 |
  1. PUT /my_index
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "standard",
  8. "char_filter": [
  9. "my_mappings_char_filter"
  10. ]
  11. }
  12. },
  13. "char_filter": {
  14. "my_mappings_char_filter": {
  15. "type": "mapping",
  16. "mappings": [
  17. ":) => _happy_",
  18. ":( => _sad_"
  19. ]
  20. }
  21. }
  22. }
  23. }
  24. }
  25. GET /my_index/_analyze
  26. {
  27. "tokenizer": "keyword",
  28. "char_filter": [ "my_mappings_char_filter" ],
  29. "text": "I'm delighted about it :("
  30. }
  31. #结果:[ 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”: {

    1. "analyzer": {
    2. "my_analyzer": {
    3. "tokenizer": "standard",
    4. "char_filter": [
    5. "my_char_filter"
    6. ]
    7. }
    8. },
    9. "char_filter": {
    10. "my_char_filter": {
    11. "type": "pattern_replace",
    12. "pattern": "(\\d+)-(?=\\d)",
    13. "replacement": "$1_"
    14. }
    15. }

    } } }

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" 
    ]
  }
}