elasticsearch中无法识别的字符转义



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

{
"query": {
  "constant_score": {
    "filter": {
      "bool": {
        "must": [
          {
            "regexp": {
              "displayName" : "(^aw+| 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中的Regexp查询不是完全灵活的。
例如,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_]+))"
             }
           }
         ]
       }
     }   } } }

根据Elasticsearch regex文档,它的语法不支持在其他regex风格中常见的速记字符类,所以你不能使用w,你只能使用字符类(或括号表达式),如[a-zA-Z]来匹配字母,或[a-zA-Z0-9_]来匹配w在JavaScript中匹配的内容。

接下来,^$,在其他口味中也很常见,不被ES regex支持。整个模式默认是锚定的,因此这些甚至是不必要的。

现在,您想要任何包含J的单词。有几个选项:

  1. ".*J.*"将匹配任何包含J
  2. 的字符串
  3. ".*J[a-zA-Z].*"将匹配任何包含J和字母
  4. 的字符串
  5. "J[a-zA-Z].*|.* J[a-zA-Z].*"将匹配任何以J开头的字符串,然后是一个字母,然后是任何字符,或者任何包含空格、J和它后面的任何字母的字符串。

最新更新