2

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

你能为我指出正确的方向吗?提前致谢,

4

1 回答 1

2

您启用了与整个字符串匹配的ALL标志,请参阅ElasticSearch 正则表达式文档@

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

# @ & < > ~

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

at 符号"@"完全匹配任何字符串。使用or标志
启用。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"
    }
  }
}
于 2019-02-08T17:19:59.860 回答