试图在elasticsearch中使用以下查询进行正则表达式搜索:

{
"query": {
  "constant_score": {
    "filter": {
      "bool": {
        "must": [
          {
            "regexp": {
              "displayName" : "(^a\w+| a(\w+))"
            }
          }
        ]
      }
    }
  }
}
}

这个正则表达式可以在https://regex101.com/中正常工作,但是上面的查询给出了:
nested: QueryParsingException[[bm_md_acct_9993342_v1] Failed to parse]; nested: JsonParseException[Unrecognized character escape 'w' (code 119)\n at [Source: UNKNOWN; line: 10, column: 37]]; }

我尝试以不同的方式进行转义,但没有成功。如何正确设置转义序列?

尝试过:
{
"query": {
  "constant_score": {
    "filter": {
      "bool": {
        "must": [
          {
            "regexp": {
              "displayName" : "(^J\\w+| J(\\w+))"
            }
          }
        ]
      }
    }
  }
}
}

即使存在displayName“Jason Cremer”的记录,也会给出空结果。

最佳答案

elasticsearch中的正则表达式查询不是完全灵活的。
例如,\w匹配常规正则表达式约定中的任何单词字符,但是在elasticsearch中,由于\w是elasticsearch中的保留字符,因此无法表示\

为了使\w在elasticsearch中有效,我们必须使用\进行转义,这会将您的正则表达式转换为\\\w。现在,此\\\w更改了正则表达式的含义。

它将匹配"\" followed by "w" rather than matching word character

我的建议是将您的正则表达式中的\ w替换为[a-zA-Z0-9_]。这会起作用。
同样,您不能为单个字符使用^。删除您的正则表达式中,您的查询将是

 { "query": {   "constant_score": {
     "filter": {
       "bool": {
         "must": [
           {
             "regexp": {
               "displayName" : "(J[a-zA-Z0-9_]+| J([a-zA-Z0-9_]+))"
             }
           }
         ]
       }
     }   } } }

关于regex - Elasticsearch中无法识别的字符转义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40588632/

10-11 08:42