Kibana:如何在 Search Bar 中实现模糊查询及通配符查询

我们知道在 Kibana 中,我们可以实现三种搜索

  1. DSL 搜索,你可以参照我之前的文章 “开始使用Elasticsearch (2)” 进行详细了解
  2. KQL 搜索,你可以参照我之前的文章 “Kibana: 如何使用 Search Bar
  3. Lucene 搜索,你可以参照我之前的文章 “Kibana: 如何使用 Search Bar

在这三种搜索方法中,DSL 以及 Lucene 搜索可以支持模糊查询 (fuzziness) 以及 通配符查询 (Regex)。KQL 是 Search Bar 的默认搜索方式,但是它不支持模糊查询。今天我们来重点介绍一下如何通过 Lucene 搜索来实现模糊查询以及通配符查询。那么我们该如何进行 Lucene 查询呢?

在默认的情况下,KQL (Kibana Query Language)是 Search Bar 的默认搜索语言。它的好处是具有自动完成功能,比如:

为了实现切换到 Lucene 搜索,我们点击上面的 KQL:

我们点击上面的开关:

这样我们的 Search Bar 的搜索方式就变成了 Lucene 的搜索方式了。在 Lucene 搜索模式下,autocomplete 功能将消失。我们需要记住完整的搜索命令才可以。

 

准备数据

在今天的练习中,我们将展示如何在 Search Bar 中实现模糊查询以及通配符查询。为此,我们创建如下的一个文档:

PUT my_index/_doc/1
{
  "content": "I like the articles from liuxg"
}

在 Kibana 的 console 中输入上面的命令。这样我们就创建一个叫做 my_index 的索引,并且它含有一个文档。如果我们想使用 DSL 来实现这个模糊查询,我们可以这么做:

GET my_index/_search
{
  "query": {
    "match": {
      "content": {
        "query": "liuxo",
        "fuzziness": 1
      }
    }
  }
}

上面标明,如果有一个拼写错误,我们也可以搜索到上面的文档。当然,我们也可以把 fuziness 设置为 2,或者是 auto,依据自己的需要。如果你想了解更多的关于模糊查询的知识,请参阅我的文章 “Elasticsearch:fuzzy 搜索 (模糊搜索)”。

我们也可以实现通配符的搜索:

GET  my_index/_search
{
  "query": {
    "wildcard": {
      "content": "liux?"
    }
  }
}

那么我们该如何来在 Search Bar 中实现同样的搜索呢?答案是使用 Lucene 搜索。

 

在 Search Bar 中实现模糊搜索及通配符搜索

首先,我们必须为 my_index 来创建一个 index pattern,以便能够在 Discover 中进行使用:

点击上面的 Create index pattern。这样就创建了 my_index 的索引模式。

我们打开 Discover,并装载 my_index 索引模式。我们首先切换到 Lucene 搜索模式:

 

通配符搜索

我们可以使用如下的方法来进行通配符搜索:

这里的 ? 代表是一个字符。这种搜索在 KQL 中是没有的。当然我们也可以进行如下的搜索:

我们还可以进行如下的搜索:

这里的 * 表示匹配多个字符。这种方式在 KQL 中也被支持。

 

模糊查询

我们可以使用如下的方式来进行模糊查询。通常使用于我们不知道具体需要搜索的文字是什么,或者是因为我们错误地输入一些词:

这里的 ~1 代表允许其中的一个字母是错误的。如果你可以允许两个字母的错误,你可以使用如下的方法:

在上面,我们有两个字母是错误的,但是我们还是可以能检索到结果。

当我们不知道到底是几个字母错误时,我们可以使用如下的方法来进行:

我们使用 ~auto 来表示。正如上面所示,当我们使用 auto 时,有两个字母错误时搜索不到结果。这个是由 Elasticsearch 自己决定到底是使用1个错误还是2个错误。当字符串的长度超过5时,fuziness 自动设置为2;如果字符串的长度少于2时,那么 fuziness 自动被设置为0.

我们修改上面的搜索,只出现一个字母的错误,我们还是使用 auto:

从上面的结果中,我们可以看出来我们可以搜索到我们想要的结果。