• DSL 搜索,你可以参照我之前的文章 “ 开始使用Elasticsearch (2) ” 进行详细了解
  • KQL 搜索,你可以参照我之前的文章 “ Kibana: 如何使用 Search Bar
  • 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: