模式替换字符过滤器
pattern_replace
字符过滤器允许您使用正则表达式定义模式,以匹配和替换输入文本中的字符。它是一个灵活的工具,适用于高级文本转换,尤其是在处理复杂字符串模式时。
此过滤器会将模式的所有实例替换为指定的替换字符串,从而可以轻松地替换、删除或复杂修改输入文本。您可以使用它在分词之前对输入进行标准化。
示例
为了标准化电话号码,您将使用正则表达式 [\\s()-]+
[ ]
:定义一个字符类,表示它将匹配方括号内的任意一个字符。\\s
:匹配任意空白字符,例如空格、制表符或换行符。()
:匹配字面意义上的括号((
或)
)。-
:匹配字面意义上的连字符(-
)。+
:指定模式应匹配前面字符的一个或多个出现。
模式 [\\s()-]+
将匹配一个或多个空白字符、括号或连字符的任意序列,并将其从输入文本中移除。这确保了电话号码被标准化且只包含数字。
以下请求通过移除空格、破折号和括号来标准化电话号码
GET /_analyze
{
"tokenizer": "standard",
"char_filter": [
{
"type": "pattern_replace",
"pattern": "[\\s()-]+",
"replacement": ""
}
],
"text": "(555) 123-4567"
}
响应包含生成的词元
{
"tokens": [
{
"token": "5551234567",
"start_offset": 1,
"end_offset": 14,
"type": "<NUM>",
"position": 0
}
]
}
参数
pattern_replace
字符过滤器必须配置以下参数。
参数 | 必需/可选 | 数据类型 | 描述 |
---|---|---|---|
模式 | 必需 | 字符串 | 用于匹配输入文本部分的正则表达式。过滤器识别并匹配此模式以执行替换。 |
替换 | 可选 | 字符串 | 替换模式匹配的字符串。使用空字符串("" )来移除匹配的文本。默认为空字符串("" )。 |
创建自定义分析器
以下请求创建一个带有自定义分析器的索引,该分析器配置了 pattern_replace
字符过滤器。该过滤器会从数字中移除货币符号和千位分隔符(欧洲的 .
和美国的 ,
)
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"pattern_char_filter"
]
}
},
"char_filter": {
"pattern_char_filter": {
"type": "pattern_replace",
"pattern": "[$€,.]",
"replacement": ""
}
}
}
}
}
使用以下请求检查使用该分析器生成的词元
POST /my_index/_analyze
{
"analyzer": "my_analyzer",
"text": "Total: $ 1,200.50 and € 1.100,75"
}
响应包含生成的词元
{
"tokens": [
{
"token": "Total",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "120050",
"start_offset": 9,
"end_offset": 17,
"type": "<NUM>",
"position": 1
},
{
"token": "and",
"start_offset": 18,
"end_offset": 21,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "110075",
"start_offset": 24,
"end_offset": 32,
"type": "<NUM>",
"position": 3
}
]
}
使用捕获组
您可以在 replacement
参数中使用捕获组。例如,以下请求创建一个自定义分析器,该分析器使用 pattern_replace
字符过滤器将电话号码中的连字符替换为点号
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"pattern_char_filter"
]
}
},
"char_filter": {
"pattern_char_filter": {
"type": "pattern_replace",
"pattern": "(\\d+)-(?=\\d)",
"replacement": "$1."
}
}
}
}
}
使用以下请求检查使用该分析器生成的词元
POST /my_index/_analyze
{
"analyzer": "my_analyzer",
"text": "Call me at 555-123-4567 or 555-987-6543"
}
响应包含生成的词元
{
"tokens": [
{
"token": "Call",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "me",
"start_offset": 5,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "at",
"start_offset": 8,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "555.123.4567",
"start_offset": 11,
"end_offset": 23,
"type": "<NUM>",
"position": 3
},
{
"token": "or",
"start_offset": 24,
"end_offset": 26,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "555.987.6543",
"start_offset": 27,
"end_offset": 39,
"type": "<NUM>",
"position": 5
}
]
}