正则表达式:获取我所有文档中使用的所有主题标签和提及内容

时间:2019-02-08 17:14:19

标签: regex elasticsearch kibana

我正在使用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中产生多个错误。我曾尝试根据文档更换某些零件,但仍然无法正常工作。

您能指出我正确的方向吗? 预先感谢,

1 个答案:

答案 0 :(得分:2)

您启用了ALL标志,使@与整个字符串匹配,请参见ElasticSearch regex documentation

  

如果启用可选功能(请参见下文),则这些字符也可能会被保留:

     

# @ & < > ~

然后,在任何字符串部分:

  

at符号"@"完全匹配任何字符串。
  通过ANYSTRINGALL标志启用。

由于这里不需要任何特殊行为,您可以简单地通过传递"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"
    }
  }
}