弹性搜索中无法识别的字符转义

时间:2016-11-14 12:19:18

标签: regex elasticsearch escaping

尝试使用以下查询在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”的记录存在,

也会给出空结果。

2 个答案:

答案 0 :(得分:0)

elasticsearch中的Regexp查询不够灵活 例如,\w匹配普通正则表达式约定中的任何单词字符,但在elasticsearch中,您无法表示\w,因为\是elasticsearch中的保留字符。

要使\w在弹性搜索中有效,我们必须使用\进行转义,这会将您的正则表达式转换为\\\w。现在这个\\\w改变了你的正则表达式的含义。

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

我的建议是用[a-zA-Z0-9_]替换正则表达式中的\ w。这会奏效。 此外,您不能将^用于单个字符。删除你的正则表达式,你的查询将是

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

答案 1 :(得分:0)

度Acc。到Elasticsearch regex documentation,它的语法不支持在其他正则表达式中常见的速记字符类,所以你不能使用\w,你只能使用像{一样的字符类(或括号表达式) {1}}匹配字母,或[a-zA-Z]匹配JavaScript中的[a-zA-Z0-9_]匹配。

接下来,ES正则表达式不支持\w^,在其他版本中也很常见。整个模式默认锚定,因此甚至不需要这些模式。

现在,你想要任何包含$的单词。有几种选择:

  1. J将匹配包含".*J.*"
  2. 的任何字符串
  3. J将匹配包含".*J[a-zA-Z].*"的所有字符串,然后匹配字母
  4. J将匹配以"J[a-zA-Z].*|.* J[a-zA-Z].*"开头的任何字符串,然后是字母,然后是任何字符,或包含空格J的任何字符串,以及后面的任何字母。