一直尝试在 elasticsearch 中进行正则表达式搜索,使用以下查询:{\'query\':{\'constant_score\':{\'filter\':{\'bool\':{\'must\':[{\'regexp\':{...
一直尝试在 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
,只能使用字符类(或括号表达式)来 [a-zA-Z]
匹配字母,或 [a-zA-Z0-9_]
匹配 \w
JavaScript 中匹配的内容。
接下来, ^
和 $
在其他风格中也很常见,但 ES 正则表达式不支持。整个模式 默认是锚定的 ,因此这些甚至不是必需的。
现在,你想要任何有 inside 的单词 J
。有几种选择:
".*J.*"
将匹配包含以下项的任何字符串 J
".*J[a-zA-Z].*"
将匹配包含 J
字母
"J[a-zA-Z].*|.* J[a-zA-Z].*"
将匹配以 开头的任意字符串 J
,然后是字母,然后是任意字符,或者包含空格、 J
以及其后的任意字母的任意字符串。
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_]+))"
}
}
]
}
} } } }