You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch 2.2:利用edge-ngram和pattern filter提取指定标题内容

解决Elasticsearch 2.2中提取特定格式标题字段的问题

嘿,针对你在Elasticsearch 2.2里处理这类标题字段的需求,我来给你拆解下怎么调整分析器配置,拿到你想要的SimpleDoc000155和155这两个结果:

首先,先明确你的字段格式:前缀(长度/字符类型不固定)+数字串+/+单个数字,比如示例中的SimpleDoc000155/1。我们需要通过pattern_capture过滤器来精准捕获两个目标内容:斜杠前的完整前缀+数字串,以及数字串去掉前导零后的有效数字部分。

调整后的分析器配置

我帮你修改了原有的配置,用keyword分词器替代autocomplete(因为我们不需要拆分字段,而是要对整个字段做正则捕获),并更新了pattern_capture的规则:

"analysis": {
  "analyzer": {
    "my_analyzer": {
      "tokenizer": "keyword",
      "filter": [
        "code_extraction",
        "lowercase"  // 若不需要小写转换,可移除这一项
      ]
    }
  },
  "filter": {
    "code_extraction": {
      "type": "pattern_capture",
      "preserve_original": 0,  // 设为1会保留原始字段值,按需调整
      "patterns": [
        "([^/]+)",  // 捕获斜杠前的完整内容,即SimpleDoc000155
        "(?:.*?)(0*(\\d+))(?=\\/)"  // 捕获前缀后数字串去掉前导零的部分,即155
      ]
    }
  }
}

配置说明

  • keyword分词器:确保整个标题字段作为单个token传入过滤器,避免不必要的拆分干扰正则匹配。
  • pattern_capture过滤器:
    1. 第一个正则([^/]+):匹配斜杠前的所有字符,直接捕获你需要的SimpleDoc000155。
    2. 第二个正则(?:.*?)(0*(\\d+))(?=\\/):
      • (?:.*?):非贪婪匹配前缀部分(不生成token),确保不会吃掉后面的数字。
      • 0*(\\d+):匹配前导零加有效数字,只捕获有效数字部分(比如000155会提取出155)。
      • (?=\\/):正向预查,确保匹配的内容后面紧跟斜杠,避免误匹配其他数字。
  • preserve_original:设为0时只会输出两个捕获结果;如果需要保留原始标题字段值,改为1即可。

测试效果

用这个分析器处理SimpleDoc000155/1,会得到两个token(如果保留lowercase的话):simpledoc000155和155,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Klemen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:21:15