【问题标题】:RegEx for matching any 2 letters + any 6 numbers in lucene用于匹配 lucene 中任意 2 个字母 + 任意 6 个数字的正则表达式
【发布时间】:2019-09-21 11:18:37
【问题描述】:

我正在为 Elastic Search 中的重要术语聚合编写排除过滤器。我想从结果中排除与模式匹配的任何术语(任意 2 个字母)(任意 6 个数字),即 AB123456

我试过了:

[a-zA-Z]{2}&<0-9>{6}

但是当我尝试更新我的可视化时 Kibana 给出了一个错误

[x_content_parse_exception] [1:72] [significant_terms] exclude doesn't support values of type: START_OBJECT

这个 JavaScript 似乎做了我想做的事:

([a-zA-Z]{2}\d{6})

但我正在努力将其翻译成 Lucene

【问题讨论】:

  • 为什么不直接使用[a-zA-Z]{2}\d{6}
  • [a-zA-Z]{2}[0-9]{6} 应该可以工作。
  • 检查 docs 似乎 Lucene 不支持像 \d 这样的简写。请改用[0-9]
  • [a-zA-Z]{2}[0-9]{6} 给出同样的错误
  • 那么你的问题不是正则表达式。

标签: regex elasticsearch lucene


【解决方案1】:

这里不需要“&”,它会尝试查找同时匹配 [az]{2} 和 {2} 的 tokens,而不是比一个接一个。

这是基于我对问题的理解的解决方案。它将排除包含 2 个字母后跟 6 个数字的文档:

PUT /stackoverflowtest/_doc/1
{
    "value" : "AB123456"
}

PUT /stackoverflowtest/_doc/2
{
    "value" : "AB1234Z"
}

PUT /stackoverflowtest/_doc/3
{
    "value" : "This document has one at the end: AB123456"
}

POST /stackoverflowtest/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "regexp": {
            "value": "[a-z]{2}<0-9>{6}"
          }
        }
      ]
    }
  }
}

这仅返回一个文档,即值“AB1234Z”的文档,该文档不包含 2 个字母后跟 6 个数字的任何标记。

【讨论】:

  • 我使用用于可视化的完整 JSON 输入发布了自己的答案,但我将您的答案标记为已接受,因为它帮助我解决了导致错误消息的语法问题
【解决方案2】:

这是我用来获得所需结果的完整 JSON。我正在使用重要术语聚合器从支持票的注释中提取关键字。我需要设置一个 background_filter,然后从我的原始问题中排除文本模式。

文档结构:

摘要:错误消息的名称

注意:错误的详细信息,包括我不关心的用户名,例如 AB123456。

"significant_terms": {
        "field": "notes",
        "size": 10,
        "background_filter": {
          "query_string": {
            "query": "summary: ErrorMessage1* OR ErrorMessage2*",
            "analyze_wildcard": "true"
          }
        },
        "exclude": "[a-zA-Z]{2}[0-9]{6}"
      }

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2023-02-10
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多