Link Search Menu Expand Document Documentation Menu

模式替换字符过滤器

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
    }
  ]
}
剩余 350 字符

有问题?

想要贡献?