一直在尝试在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
的单词。有几个选项:
-
".*J.*"
将匹配任何包含J
的字符串 -
".*J[a-zA-Z].*"
将匹配任何包含J
和字母 的字符串 -
"J[a-zA-Z].*|.* J[a-zA-Z].*"
将匹配任何以J
开头的字符串,然后是一个字母,然后是任何字符,或者任何包含空格、J
和它后面的任何字母的字符串。