【Elastic Engineering】创作 Kibana: 如何使用 Search Bar

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 我们知道 Kibana 作为 Elasticsearch 的数据呈现及分析,在 Kibana 中,search 几乎遍布所有的页面。搜索对于 Elastic 至关重要。了解如何在 Kibana 中进行搜索时非常重要的。它不仅仅限于我们对于输入字的搜索,或者对于一些词的过滤。


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



  • 通过构建正则表达式或者通配符进行搜索


  • 对某些字段进行加权搜索


Search Bar 在许多的 Kibana 应用中都有被用到:



你也可以在其他的一些应用中可以看到:


image.png    

如何使用 Kibana 中的 Search Bar

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 会自动弹出选项让我们进行选择。


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



如果我们输入:


customer_full_name: Abigail Stewart


 

它表明 customer_full_name 包含 Abigail Stewart 其中的任何一个。如果我们想进行

exact phrase 匹配,我们可以这么写:


customer_full_name: ”Abigail Stewart“



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



搜索词周围的引号将启动词组(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"



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



关于 KQL 的更多说明,可以参考另外一篇文章 “Kibana:Kibana Query Language - KQL”。


Lucene 方式进行搜索:


为了能够进行 Lucene 方式进行搜索,我们必须切换到 Lucence 方式。在这种方式下,当我们在输入框里输入字段时没有提示,不能帮我们自动完成输入。它使用 Elasticsearch 的 query string 语法来进行搜索。你可以阅读 “Elasticsearch: query_string 查询” 来了解更多。



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



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



我们也可以按照如下的方法搜索 OriginCountry 是 US 或者是 DE 的所有文档。在下面的语法中,我们一定要注意到 OR,这是一个大写的字母组合。同样当我们想要同时满足两个条件时,我们必须使用 AND,而不是小写的 and。这个和在 KQL 下的情况是不同。如果在 Luncene 搜索模式下,我们输入 and,则表示我们想查询的单词是 and,而不是表示 AND



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



或者模糊查询:



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



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



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



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



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



相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
5月前
|
存储 搜索推荐 关系型数据库
【搜索引擎】elastic search核心概念
【搜索引擎】elastic search核心概念
48 0
|
存储 安全 Java
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(3)
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(3)
126 0
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(3)
|
数据安全/隐私保护
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(4)
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(4)
165 0
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(4)
|
自然语言处理 Java 索引
Elastic Search一些用法
Elastic Search一些用法
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(5)
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(5)
|
存储 算法 搜索推荐
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(2)
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(2)
120 0
|
Ubuntu 物联网 大数据
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(6)
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(6)
126 0
|
搜索推荐 安全 文件存储
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(1)
带你读《Elastic Stack 实战手册》之62:—— 3.5.18.1.Workplace Search(1)
127 0
|
JavaScript 搜索推荐
带你读《Elastic Stack 实战手册》之63:—— 3.5.18.2.Site Search(中)
带你读《Elastic Stack 实战手册》之63:—— 3.5.18.2.Site Search(中)
115 0
|
搜索推荐 索引
带你读《Elastic Stack 实战手册》之63:—— 3.5.18.2.Site Search(上)
带你读《Elastic Stack 实战手册》之63:—— 3.5.18.2.Site Search(上)
165 0