我正在使用Kibana控制台执行此类查询(它们是分开的:一个用于主题标签,一个用于提及)。文档集合是带有textContent字段的博客条目,其中可能包含诸如@theUserName @AnotherOne之类的用户提及或诸如#helloWorld和#hello2之类的井号。查询如下所示:
GET /xblog/_search
{
"source": [
"id",
"textContent"
],
"query": {
"regexp": {
"textContent": {
"value": "@([^-A-Za-z0-9])",
"flags": "ALL"
}
}
}
}
但是问题是它还会返回不包含@userMention的文档。我认为正则表达式中的@被视为特殊符号,但是在阅读文档时,我找不到如何对其进行转义。
在文档1中,作者说您可以用双引号将任何符号转义,所以我进行了测试:
“” @“” 但是我什么也没得到。
我也测试我习惯的表达式,例如: / \ s([@#] [\ w _-] +)/ g
但这会在Kibana中产生多个错误。我曾尝试根据文档更换某些零件,但仍然无法正常工作。
您能指出我正确的方向吗? 预先感谢,
答案 0 :(得分:2)
您启用了ALL
标志,使@
与整个字符串匹配,请参见ElasticSearch regex documentation:
如果启用可选功能(请参见下文),则这些字符也可能会被保留:
# @ & < > ~
然后,在任何字符串部分:
at符号
"@"
完全匹配任何字符串。
通过ANYSTRING
或ALL
标志启用。
由于这里不需要任何特殊行为,您可以简单地通过传递"flags": "NONE"
或使用@
,"\\@([^-A-Za-z0-9])"
来告诉引擎使用“简单”正则表达式:>
任何保留字符都可以使用反斜杠
"\*"
进行转义,包括文字反斜杠字符:"\\"
并且由于需要整个字符串匹配,因此可能需要在两端添加.*
(以匹配包含 个匹配项的字符串):
"query": {
"regexp": {
"textContent": {
"value": ".*@[^-A-Za-z0-9].*",
"flags": "NONE"
}
}
}
或
"query": {
"regexp": {
"textContent": {
"value": ".*\\@[^-A-Za-z0-9].*",
"flags": "ALL"
}
}
}