尝试使用以下查询在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”的记录存在,也会给出空结果。
答案 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
和^
,在其他版本中也很常见。整个模式默认锚定,因此甚至不需要这些模式。
现在,你想要任何包含$
的单词。有几种选择:
J
将匹配包含".*J.*"
J
将匹配包含".*J[a-zA-Z].*"
的所有字符串,然后匹配字母J
将匹配以"J[a-zA-Z].*|.* J[a-zA-Z].*"
开头的任何字符串,然后是字母,然后是任何字符,或包含空格J
的任何字符串,以及后面的任何字母。