试图在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/