Kibana: 如何使用 Search Bar

我们知道 Kibana 作为 Elasticsearch 的数据呈现及分析,在 Kibana 中,search 几乎遍布所有的页面。搜索对于 Elastic 至关重要。了解如何在 Kibana 中进行搜索时非常重要的。它不仅仅限于我们对于输入字的搜索,或者对于一些词的过滤。它还包括:

  • 模糊查询
  • 通过构建正则表达式或者通配符进行搜索
  • 对某些字段进行加权搜索

 

Kibana 的搜索方式

在 Kibana 的搜索中,有一下三种方式进行搜索:

  • KQL (Kibana Query Language)

  • Lucene

 

当我们关掉KQL开关后,就变成如下的设置了:

  • DSL: 这种方式适用于使用 Kibana 中的 Dev Tools。在我之前的很多教程中都已经使用过。这里就不一一讲述。您可以参考我之前的文章 “开始使用Elasticsearch (2)” 进行详细地阅读。

 

下面,我们来分别描述如何使用这些来做我们的搜索。

什么是 index pattern?

Index pattern:它指向一个或多个 Elasticsearch 的索引,并告诉 Kibana 想对哪些索引进行操作。

从上面我们可以看出来,所有是的索引存在于 Elasticsearch 之中,我们需要 Index pattern 让 Kibana 来对这个索引进行操作。

 

数据类型

对于Elasticsearch来说,有两类数据可以进行分析:

  • Time series (时间系列):这类数据的每个事件都是和时间的某一个时刻相关的。一般来说增长很快。通常会有一个和时间相关的字段。
{
    "tweet": "Wow Elasticsearch 7.0 seems awesome!",
     "hashtags": ["elasticsearch", "kibana"]
    "timestamp": September 1st 2017, 07:15:40.035
}
  • Static data (静态数据):这类数据通常增长很慢,通常没有相应的时间标志。
{
   "cuisine": "French",
   "ingredients": "Cheese, flour, butter, eggs, milk, nutmeg",
   "time_in_min": 50,
   "level": "easy"
}

当我们创建自己的 Index pattern 时,我们需要对我们的数据类型进行选择:

在上面我们需要根据自己的索引的名称输入相应的 index pattern。它可以是指向某单个的索引,也可以通过通配符指向多个索引。如果你的 index 里含有有时间相关的字段,Kibana 会自动弹出选项让我们选择是否需要 Time Filter:

如果我们选择 Time Filter 的字段,那么将会按照时间系列(Time series)的方法来处理。否则,我们可以选择不使用 Time Filter,那么我们只能对该 index 进行搜索,而不能对它进行和时间系列相关的操作。针对这种情况,我们下面介绍的 Time picker 将不再适用。

如果我们想删除一个 Index pattern,我们也可以在上面的页面中选择删除即可:

我们可以点击右上角的星图标使得这个索引是我们的默认 Index。在上面的图中,我们也可以看到有的field是可以Search的,有的是可以做aggregation的。如果大家想对这个有更多的了解,请详细阅读我之前的文章“Elasticsearch:inverted index,doc_values 及 source”。

 

准备数据

我们可以利用 Kibana 自带的数据来做演示。我们按照如下的方式来加载数据:

 

选择 “Add sample data”:

我们选择 “Add data”,这样我们就把我们需要的样本数据加载到 Elasticsearch 了。

在进行搜索之前,我们必须明白两个重要的东西:

  • 选中需要操作的 Index pattern
  • Time picker:对于 time series (时序)数据来说,这个非常重要。如果没有选好对应的时间,可能在 Kibana 中没有任何的数据。

Kibana 搜索

我们首先来查看一下我们的 kibana_sample_data_flights 索引的一个文档内容。

        "_source" : {
          "FlightNum" : "9HY9SWR",
          "DestCountry" : "AU",
          "OriginWeather" : "Sunny",
          "OriginCityName" : "Frankfurt am Main",
          "AvgTicketPrice" : 841.2656419677076,
          "DistanceMiles" : 10247.856675613455,
          "FlightDelay" : false,
          "DestWeather" : "Rain",
          "Dest" : "Sydney Kingsford Smith International Airport",
          "FlightDelayType" : "No Delay",
          "OriginCountry" : "DE",
          "dayOfWeek" : 0,
          "DistanceKilometers" : 16492.32665375846,
          "timestamp" : "2019-11-18T00:00:00",
          "DestLocation" : {
            "lat" : "-33.94609833",
            "lon" : "151.177002"
          },
          "DestAirportID" : "SYD",
          "Carrier" : "Kibana Airlines",
          "Cancelled" : false,
          "FlightTimeMin" : 1030.7704158599038,
          "Origin" : "Frankfurt am Main Airport",
          "OriginLocation" : {
            "lat" : "50.033333",
            "lon" : "8.570556"
          },
          "DestRegion" : "SE-BD",
          "OriginAirportID" : "FRA",
          "OriginRegion" : "DE-HE",
          "DestCityName" : "Sydney",
          "FlightTimeHour" : 17.179506930998397,
          "FlightDelayMin" : 0
        }

就像我上面提到的那样,我们首先选定我们的 index,然后在设定我们的 time picker 所对应的时间。

KQL 方式来进行搜索:

在上面我们可以看到,当我们使用 KQL 时,一个很大的好处是它可以帮我们自动提示我们想要搜索的字段,具有自动补全的功能。比如我们打入 day 时,Kibana 会自动弹出选项让我们进行选择。

我们甚至直接可以像百度那样,打入我们想要的字符串,而不用特定一个字段:

我们也可以通过通配符来进行模糊查找:

搜索词周围的引号将启动词组(phrase)搜索。 例如,消息:“Quick brown fox” 将在消息字段中搜索短语 “quick brown fox”。 没有引号,您的查询将通过消息字段配置的分析器分解为 token,并且将匹配包含这些 token 的文档,而不考虑其出现的顺序。 这意味着带有 “quick brown fox” 的文档将匹配,但是 “quick fox brown” 也将匹配。 如果要搜索短语 (phrase),请记住使用引号。搜索phrase 时,每个 token 的顺序是非常重要的。

查询解析器将不再在空白处拆分。 多个搜索词必须由显式布尔运算符分隔。 Lucene 会将搜索字词与或默认组合,这些布尔操作符为 or, and 及 not。

上面的搜索将会返回 dayofWeek 为1或者 OriginCountry 为 "DE" 的所有文档。如果我们想搜索同时满足这个两个条件的文档,我们可以使用 and

显然这个时候我们看到的文档数只有23个,比之前的少很多。我们也可以使用not来返回非操作,比如我们想得到所有OriginCountry 不为 DE 的文档,我们可以直接搜索 not OriginCountry: "DE"

我们也可以对字段进行范围来搜索,比如:

Lucene方式进行搜索:

为了能够进行 Lucene 方式进行搜索,我们必须切换到 Lucence 方式。在这种方式下,当我们在输入框里输入字段时没有提示,不能帮我们自动完成输入。

我们可以搜索一个范围的文档:

在上面,如果我们不想包括 3 的话,我们应该写为:dayOfWeek:[0 TO 3}。你也可以写从 3 向上的任何值:

我们也可以按照如下的方法搜索 OriginCountry 是 US 或者是 DE 的所有文档。

我们也可以对某个字段进行加权,比如我们可以突出 OriginCountry 为 DE 的国家。在如下的搜寻中,我们给 OriginCountry 为 DE 的文档 3 倍的分数,这样使得这些文档尽量在排名的前面。

或者模糊查询:

或者只有一个 edit 的模糊查询 (请注意这里的 edit 的概念,在模糊查询文章里查看):

你也可以使用通配符 来匹配任何一个字母(请注意这个在 KQL 中是没有的):

我们也可以使用正则表达式来进行搜索。假如我们不知道我们的 OriginCountry 是 US 还是什么,我们知道后面的一个字母时 S,那么我们可以使用如下的方法来查询:

同样我们可以使用  .? 正则来查询有0个或1个字母:

你也可以通过 .* 正则来匹配0个或多个字母的搜索:

已标记关键词 清除标记