字符过滤器参考

edit

字符过滤器参考

edit

字符过滤器用于在字符流传递给分词器之前对其进行预处理。

字符过滤器接收原始文本作为字符流,并可以通过添加、删除或更改字符来转换流。例如,字符过滤器可以用于将阿拉伯-印度数字(٠‎١٢٣٤٥٦٧٨‎٩‎)转换为其阿拉伯-拉丁等效数字(0123456789),或者从流中去除HTML元素,如

Elasticsearch 有许多内置的字符过滤器,可以用来构建 自定义分析器

HTML Strip Character Filter
The html_strip 字符过滤器去除 HTML 元素,如 和 解码 HTML 实体,如 &
Mapping Character Filter
The mapping 字符过滤器将指定字符串的任何出现替换为指定的替换内容。
Pattern Replace Character Filter
The pattern_replace 字符过滤器将匹配正则表达式的任何字符替换为指定的替换字符。

HTML 剥离字符过滤器

edit

从文本中去除HTML元素,并将HTML实体替换为其解码后的值(例如,将&替换为&)。

The html_strip filter uses Lucene’s HTMLStripCharFilter

示例

edit

以下analyze API请求使用html_strip过滤器将文本

I'm so happy!

转换为\nI'm so happy!\n

GET /_analyze
{
  "tokenizer": "keyword",
  "char_filter": [
    "html_strip"
  ],
  "text": "<p>I&apos;m so <b>happy</b>!</p>"
}

该过滤器生成以下文本:

[ \nI'm so happy!\n ]

添加到分析器

edit

以下创建索引 API请求使用html_strip过滤器来配置一个新的自定义分析器

PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "char_filter": [
            "html_strip"
          ]
        }
      }
    }
  }
}

可配置参数

edit
escaped_tags
(可选,字符串数组) 不包含尖括号 (< >) 的 HTML 元素数组。过滤器在从文本中剥离 HTML 时会跳过这些 HTML 元素。例如,值为 [ "p" ] 时会跳过

HTML 元素。

自定义

edit

要自定义 html_strip 过滤器,请复制它以创建新自定义字符过滤器的基础。您可以使用其可配置参数来修改过滤器。

以下创建索引 API请求 配置了一个新的自定义分析器,使用了一个自定义的 html_strip过滤器,my_custom_html_strip_char_filter

过滤器 my_custom_html_strip_char_filter 跳过移除 HTML 元素。

PUT my-index-000001
{
  "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"
          ]
        }
      }
    }
  }
}

映射字符过滤器

edit

The mapping 字符过滤器接受一个键和值的映射。每当它遇到一个与键相同的字符串时,它就会用与该键关联的值替换它们。

匹配是贪婪的;在给定点匹配的最长模式获胜。 替换允许为空字符串。

The mapping filter uses Lucene’s MappingCharFilter

示例

edit

以下analyze API请求使用mapping过滤器 将阿拉伯-印度数字(٠‎١٢٣٤٥٦٧٨‎٩‎)转换为其阿拉伯-拉丁等效数字(0123456789),将文本My license plate is ٢٥٠١٥转换为 My license plate is 25015

GET /_analyze
{
  "tokenizer": "keyword",
  "char_filter": [
    {
      "type": "mapping",
      "mappings": [
        "٠ => 0",
        "١ => 1",
        "٢ => 2",
        "٣ => 3",
        "٤ => 4",
        "٥ => 5",
        "٦ => 6",
        "٧ => 7",
        "٨ => 8",
        "٩ => 9"
      ]
    }
  ],
  "text": "My license plate is ٢٥٠١٥"
}

该过滤器生成以下文本:

[ My license plate is 25015 ]

可配置参数

edit
mappings

(必填*, 字符串数组) 映射数组,每个元素的形式为 键 => 值

必须指定此参数或 mappings_path 参数。

mappings_path

(必填*, 字符串) 包含 键 => 值 映射的文件路径。

此路径必须是绝对路径或相对于config位置的相对路径,并且文件必须使用UTF-8编码。文件中的每个映射必须用换行符分隔。

要么指定这个参数,要么指定mappings参数。

自定义并添加到分析器

edit

要自定义 mappings 过滤器,请复制它以创建新自定义字符过滤器的基础。您可以使用其可配置参数来修改过滤器。

以下创建索引 API请求配置了一个新的自定义分析器,使用了一个自定义的mappings过滤器,my_mappings_char_filter

过滤器 my_mappings_char_filter 将表情符号 :):( 替换为等效的文本。

PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_mappings_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_mappings_char_filter": {
          "type": "mapping",
          "mappings": [
            ":) => _happy_",
            ":( => _sad_"
          ]
        }
      }
    }
  }
}

以下analyze API请求使用自定义的my_mappings_char_filter在文本I'm delighted about it :(中将:(替换为_sad_

GET /my-index-000001/_analyze
{
  "tokenizer": "keyword",
  "char_filter": [ "my_mappings_char_filter" ],
  "text": "I'm delighted about it :("
}

该过滤器生成以下文本:

[ I'm delighted about it _sad_ ]

模式替换字符过滤器

edit

The pattern_replace 字符过滤器使用正则表达式来匹配应替换为指定替换字符串的字符。替换字符串可以引用正则表达式中的捕获组。

当心病态的正则表达式

模式替换字符过滤器使用 Java 正则表达式

一个编写糟糕的正则表达式可能会运行得非常缓慢,甚至抛出StackOverflowError,并导致运行它的节点突然退出。

了解更多关于病态正则表达式及其避免方法

配置

edit

The pattern_replace 字符过滤器接受以下参数:

模式

一个 Java 正则表达式。必需。

替换

替换字符串,可以使用$1..$9语法引用捕获组,如 这里所述。

标志

Java 正则表达式 标志。 标志应使用竖线分隔,例如 "CASE_INSENSITIVE|COMMENTS"

示例配置

edit

在这个例子中,我们配置了 pattern_replace 字符过滤器,用于将数字中的任何嵌入的破折号替换为下划线,即 123-456-789123_456_789

PUT my-index-000001
{
  "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-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "My credit card is 123-456-789"
}

上述示例产生以下术语:

[ My, credit, card, is, 123_456_789 ]

使用一个改变原始文本长度的替换字符串将适用于搜索目的,但会导致高亮显示不正确,如下例所示。

此示例在遇到小写字母后跟一个大写字母时插入一个空格(即 fooBarBazfoo Bar Baz),允许对驼峰式单词进行单独查询:

PUT my-index-000001
{
  "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-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "The fooBarBaz method"
}

上述返回以下术语:

[ the, foo, bar, baz, method ]

查询 bar 将正确找到文档,但由于我们的字符过滤器改变了原始文本的长度,结果的高亮显示将不正确:

PUT my-index-000001/_doc/1?refresh
{
  "text": "The fooBarBaz method"
}

GET my-index-000001/_search
{
  "query": {
    "match": {
      "text": "bar"
    }
  },
  "highlight": {
    "fields": {
      "text": {}
    }
  }
}

上述的输出结果是:

{
  "timed_out": false,
  "took": $body.took,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped" : 0,
    "failed": 0
  },
  "hits": {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "my-index-000001",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "text": "The fooBarBaz method"
        },
        "highlight": {
          "text": [
            "The foo<em>Ba</em>rBaz method" 
          ]
        }
      }
    ]
  }
}

注意不正确的突出显示。