如何在 Kibana/ELK 中进行“where not exists”类型过滤?
Posted
技术标签:
【中文标题】如何在 Kibana/ELK 中进行“where not exists”类型过滤?【英文标题】:How to do "where not exists" type filtering in Kibana/ELK? 【发布时间】:2015-02-16 16:56:05 【问题描述】:我正在使用 ELK 从我的日志文件创建仪表板。我有一个日志文件,其中包含一个 id 值和一个“成功”/“失败”值的条目,显示具有给定 id 的操作是成功还是失败。每个操作/id 可以失败无限次,最多成功一次。在我的 Kibana 仪表板中,我想为每个操作 ID 显示具有“失败”值的日志条目计数,但我想过滤掉该 ID 存在“成功”日志条目的情况。即我只对从未成功的操作感兴趣。有什么技巧可以实现这一点吗?
【问题讨论】:
【参考方案1】:在较新版本的 Kibana 中,默认语言现在是 KQL(Kibana 查询语言),不再是 Lucene。所以这里的大多数答案都已经过时了。字段是否存在的查询如下:
your_variable:*
要回答你的问题,你可以否定它:
not your_variable:*
您可以在此处找到更多文档:https://www.elastic.co/guide/en/kibana/7.15/kuery-query.html
如果您在搜索字段中单击该按钮,也可以切换回 Lucene,但我认为新语言更易于使用:
【讨论】:
【参考方案2】:! (_exists_:NAME)
不适合我。我使用的建议来自:
https://discuss.elastic.co/t/kibana-5-0-0--missing--is-not-working-anymore/64336
NOT _exists_:NAME
UPDATE 我遇到的问题是 ES 语法禁止在否定运算符后使用空格。使用以下之一:
NOT _exists_:FIELD
!_exists_:FIELD
-_exists_:FIELD
查看教程:https://www.timroes.de/2016/05/29/elasticsearch-kibana-queries-in-depth-tutorial/
注意:在 Elasticsearch 7.x 中,Kibana 现在有一个下拉菜单,可以在搜索栏中选择 KQL 或 Lucene 样式的查询。请注意,_exists_:FIELD
等语法是 Lucene 语法,您需要相应地设置下拉菜单。
【讨论】:
【参考方案3】:这在 Kibana 5 搜索栏中很容易。只需添加一个过滤器
!(_exists_:"your_variable")
您可以切换过滤器或将反向查询编写为
_exists_:"your_variable"
在 Kibana 4 和 Kibana 3 中,您可以使用现在已弃用的查询
_missing_:"your_variable"
注意:在 Elasticsearch 7.x 中,Kibana 现在有一个下拉菜单,可以在搜索栏中选择 KQL 或 Lucene 样式的查询。请注意,_exists_:FIELD
等语法是 Lucene 语法,您需要相应地设置下拉菜单。
【讨论】:
作为参考,这里是记录“存在”和“缺失”的 _ 符号的链接:elastic.co/guide/en/elasticsearch/reference/current/…_missing_
似乎不再出现在 ElasticSearch 5.0 中。 !(_exists_:"field")
工作正常。
感谢@Fedearne 更新查询语法!
注意:在 7.x 中,当存在 OR
时,我必须将 (!_exists_:"your_variable")
放在括号中【参考方案4】:
在较新的 ELK 版本中(我认为在 Elasticsearch 6 之后),您应该使用 field:*
检查该字段是否存在,并使用 not field:*
检查它是否丢失。
弹性搜索参考: https://www.elastic.co/guide/en/elasticsearch/reference/6.5/query-dsl-query-string-query.html#_wildcards
【讨论】:
谢谢!顺便说一句,在 Kibana 搜索行中,它只适用于我的大写“NOT”【参考方案5】:一种选择是在 Kibana 中为此条件创建一个自己的查询。然后只需让您的面板进行计数即可使用此查询。
value:failure
更多信息在这里: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax
【讨论】:
我只能看到在那里根据其内容选择文档的选项,而我正在寻找一种根据其他文档的内容选择文档的解决方案,即 SQL“不存在”/“不在”样式查询。我错过了什么吗? 以下方法不适合您: 1. 在 Kibana 中,使用获取日志条目的条件创建一个新查询。在您的情况下, value:failure 如果数据位于同一字段上可能就足够了,但这也适用于布尔运算符,例如 NOT。 2. 在 Kibana 中添加一个新的面板,基于简单术语的面板应该做的。对于参数字段,输入您要计算的 ID,然后在查询下拉列表中选择已选择并突出显示您在上一步中执行的查询。 问题是通过sql“不存在”样式过滤:当不存在具有相同ID的value=success的条目时,我只想计算value=failure的条目。 好的,那么上面的内容将无法正常工作,抱歉。如果您有任何其他字段指示成功的日志条目,您可以将其从查询中排除,那么上述应该可以工作。此外,Kibana 4 现在支持聚合,这可能允许您进行更高级的唯一计数。以上是关于如何在 Kibana/ELK 中进行“where not exists”类型过滤?的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu 16.04安装Elasticsearch,Logstash和Kibana(ELK)Filebeat
[Linux全套] ElasticsearchLogstash和Kibana ELK Stack深入浅出视频
使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践
怎么在 Ubuntu14.04上安装 Elasticsearch, Logstash, Kibana (ELK Stack)