我们对于Elasticsearch的使用长期以来还是停留在kibana discover中输入关键词进行简单的日志搜索,对于ES的核心搜索查询的理解和使用仍比较浅显。最近正好接到一个稍微复杂的需求,趁这个机会更加深入的去了解下搜索查询,本文先以最基础的KQL入门,后面再逐步展开。
Kibana discover 和 KQL
在Kibana discover中进行搜索,默认的都是使用的KQL (Kibana Query Language),KQL only filters data, and has no role in aggregating, transforming, or sorting data。KQL功能较简单,只能用来过滤,并不具备聚合,转换排序能功能。
我们最常见的在搜索栏中直接搜索关键词,实际上是针对所有的field进行搜索:
但实际上大多数情况下我们只是想针对message这个field进行搜索error关键词,可以采用以下指定字段的方式搜索,这样搜索的效率会更高:
针对 keyword, numeric, date, or boolean fields等类型的查询的时候必须是完全匹配(exact match)。
默认不加双引号针对text field进行查询的时候, 查询的关键词不进行排序的,如下例子:
只要message字段中包含null 和 pointer这二个单独的单词即可,无论是在句中为null pointer 还是 pointer null或者是pointer test null。如果需要按照提供的顺序进行搜索的话需要用双引号引起来:
平时用的最多的就是关键词查询,KQL同时也支持进行范围查询, 比如我们有一个日志会有个字段记录的timestamp类型的时间:
Combining multiple queries
针对复合条件查询可以采用AND OR 关键词(not case-sensitive), 针对更复杂一点的条件还可以和代码一样使用括号:
或者这样的:
KQL还有一些其他的功能,比如query nested fields等,大家可以直接查阅官方文档
https://www.elastic.co/guide/en/kibana/current/kuery-query.html
小结
开发和业务同学查询日志,主要是使用的是KQL,了解KQL的基本语法,善用discover页面提供的dataview和filter功能,可以大幅提高搜索的效率和时间。其实这个和大家经常看到的Mysql优化一样,为了提高Mysql查询的效率可以在sql查询本身,索引,表结构,系统以及硬件层面多个方面进行优化,放在ES中是同样的道理,优化查询本身(KQL,Query DSL), 结合Index和Shard的设计,操作系统和使用SSD硬盘等多个层面都进行优化,才能更好的提升查询效率。