字符过滤器参考
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请求使用 I'm so happy!html_strip过滤器将文本转换为\nI'm so happy!\n。
GET /_analyze
{
"tokenizer": "keyword",
"char_filter": [
"html_strip"
],
"text": "<p>I'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"
]
}
}
}
}
}
映射字符过滤器
editThe 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_ ]
模式替换字符过滤器
editThe pattern_replace 字符过滤器使用正则表达式来匹配应替换为指定替换字符串的字符。替换字符串可以引用正则表达式中的捕获组。
当心病态的正则表达式
模式替换字符过滤器使用 Java 正则表达式。
一个编写糟糕的正则表达式可能会运行得非常缓慢,甚至抛出StackOverflowError,并导致运行它的节点突然退出。
了解更多关于病态正则表达式及其避免方法。
配置
editThe pattern_replace 字符过滤器接受以下参数:
|
|
一个 Java 正则表达式。必需。 |
|
|
替换字符串,可以使用 |
|
|
Java 正则表达式 标志。
标志应使用竖线分隔,例如 |
示例配置
edit在这个例子中,我们配置了 pattern_replace 字符过滤器,用于将数字中的任何嵌入的破折号替换为下划线,即 123-456-789 → 123_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 ]
使用一个改变原始文本长度的替换字符串将适用于搜索目的,但会导致高亮显示不正确,如下例所示。
此示例在遇到小写字母后跟一个大写字母时插入一个空格(即 fooBarBaz → foo 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"
]
}
}
]
}
}