RegEx用于匹配Lucene中的任何2个字母+任何6个数字

时间:2019-05-02 22:04:38

标签: regex elasticsearch lucene

我正在为弹性搜索中的重要术语聚合编写一个排除过滤器。我想从结果中排除与模式(任意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

2 个答案:

答案 0 :(得分:1)

这里不需要“&”,它会尝试查找同时匹配[az] {2}和<0-9> {2}的令牌比一个接一个。

这是基于我对问题的理解的解决方案。它将排除包含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个数字表示任何令牌。

答案 1 :(得分:1)

这是我用来获取所需结果的完整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}"
      }