模式替换词元过滤器

编辑

使用正则表达式匹配并替换词元子字符串。

pattern_replace 过滤器使用 Java 的正则表达式语法。默认情况下,过滤器会将匹配的子字符串替换为空子字符串 ("")。替换子字符串可以使用 Java 的 $g 语法来引用原始词元文本中的捕获组。

编写不佳的正则表达式可能会运行缓慢或返回 StackOverflowError,导致运行该表达式的节点突然退出。

阅读更多关于 病态正则表达式以及如何避免它们 的信息。

此过滤器使用 Lucene 的 PatternReplaceFilter

示例

编辑

以下 analyze API 请求使用 pattern_replace 过滤器,将 watch 添加到 foxes jump lazy dogs 中的子字符串 dog 之前。

resp = client.indices.analyze(
    tokenizer="whitespace",
    filter=[
        {
            "type": "pattern_replace",
            "pattern": "(dog)",
            "replacement": "watch$1"
        }
    ],
    text="foxes jump lazy dogs",
)
print(resp)
response = client.indices.analyze(
  body: {
    tokenizer: 'whitespace',
    filter: [
      {
        type: 'pattern_replace',
        pattern: '(dog)',
        replacement: 'watch$1'
      }
    ],
    text: 'foxes jump lazy dogs'
  }
)
puts response
const response = await client.indices.analyze({
  tokenizer: "whitespace",
  filter: [
    {
      type: "pattern_replace",
      pattern: "(dog)",
      replacement: "watch$1",
    },
  ],
  text: "foxes jump lazy dogs",
});
console.log(response);
GET /_analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "pattern_replace",
      "pattern": "(dog)",
      "replacement": "watch$1"
    }
  ],
  "text": "foxes jump lazy dogs"
}

该过滤器生成以下词元。

[ foxes, jump, lazy, watchdogs ]

可配置参数

编辑
all
(可选,布尔值)如果为 true,则替换所有与 pattern 参数的正则表达式匹配的子字符串。如果为 false,则过滤器仅替换每个词元中第一个匹配的子字符串。默认为 true
pattern
(必需,字符串)正则表达式,以 Java 的正则表达式语法编写。过滤器将与此模式匹配的词元子字符串替换为 replacement 参数中的子字符串。
replacement
(可选,字符串)替换子字符串。默认为空子字符串 ("")。

自定义并添加到分析器

编辑

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

以下 create index API 请求使用自定义 pattern_replace 过滤器 my_pattern_replace_filter 配置新的自定义分析器

my_pattern_replace_filter 过滤器使用正则表达式 [£|€] 来匹配并删除货币符号 £。过滤器的 all 参数为 false,这意味着仅删除每个词元中第一个匹配的符号。

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "keyword",
                    "filter": [
                        "my_pattern_replace_filter"
                    ]
                }
            },
            "filter": {
                "my_pattern_replace_filter": {
                    "type": "pattern_replace",
                    "pattern": "[£|€]",
                    "replacement": "",
                    "all": False
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          my_analyzer: {
            tokenizer: 'keyword',
            filter: [
              'my_pattern_replace_filter'
            ]
          }
        },
        filter: {
          my_pattern_replace_filter: {
            type: 'pattern_replace',
            pattern: '[£|€]',
            replacement: '',
            all: false
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        my_analyzer: {
          tokenizer: "keyword",
          filter: ["my_pattern_replace_filter"],
        },
      },
      filter: {
        my_pattern_replace_filter: {
          type: "pattern_replace",
          pattern: "[£|€]",
          replacement: "",
          all: false,
        },
      },
    },
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [
            "my_pattern_replace_filter"
          ]
        }
      },
      "filter": {
        "my_pattern_replace_filter": {
          "type": "pattern_replace",
          "pattern": "[£|€]",
          "replacement": "",
          "all": false
        }
      }
    }
  }
}