草庐IT

Kibana常用查询命令

非常之观常在险远 2024-01-05 原文

1.获取所有数据

# 默认情况下,es一次展示10条数据,通过from和size来控制分页
# 索引goods的查询
GET goods/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 100
}

#如果没有查询条件也可以使用最简单的
GET goods/_search

#结果示例
{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 2,
    "successful": 2,
    "skipped": 0,
    "failed": 0
  },
  "hits": {//查询结果的统计对象
    "total": 5545,//命中数
    "max_score": 2.239803,//最大得分
    "hits": [//具体的查询数据
      {
        "_index": "goods",
        "_type": "data",
        "_id": "d6d5cba0b5ef4b20bc995d07418ae533",
        "_score": 2.239803,
        "_source": {
          "PXH": "0",
          "ZLTYPEJC": "问题解答"  
        }
      }
    ]
  }
}

2.查询索引结构

GET goods

#text:会分词,不支持聚合
#keyword:不会分词,将全部内容作为一个词条,支持聚合
#可参考https://www.cnblogs.com/candlia/p/11920029.html
#https://blog.csdn.net/qq_32165041/article/details/83688593
#结果示例
{
  "goods": {
    "aliases": {},
    "mappings": {
      "data": {
        "properties": {
          "BQID": {
            "type": "keyword",
            "ignore_above": 10922
          },
          "IVRCONTENT": {
            "type": "text",
            "fields": {//fields可以让同一文本有多种不同的索引方式,
              //比如一个String类型的字段,可以使用text类型做全文检索,使用keyword类型做聚合和排序。
              "keyword": {//类似子名字,随便取得,用的时候IVRCONTENT.field
                "type": "keyword",
                "ignore_above": 10922//ignore_above用于指定字段索引和存储的长度最大值
              }
            },
            "analyzer": "standard"
          }
        }
      }
    },
    "settings": {
      "index": {
        "number_of_shards": "2",//数据所在分片
        "provided_name": "goods",
        "max_result_window": "98854",
        "creation_date": "1631065422638",
        "number_of_replicas": "0",
        "uuid": "VTTVR9blTXiTJgFmJMxLdQ",
        "version": {
          "created": "5061299"
        }
      }
    }
  }
}

3.term和match查询

  • 词条查询:term

    词条查询不会对==查询条件==分词,只有当词条和查询字符串完全匹配时才匹配搜索。适合查询type为keyword这种类型的数据。

# term查询,只会查询title里有“华为”两字的数据,不会查询title里只有“华”或“为”的结果
GET goods/_search
{
  "query": {
    "term": {
      "title": {//字段名
        "value": "华为"//字段值
      }
    }
  }
}
  • 全文查询:match

    全文查询会对查询条件分词,先将查询条件进行分词,然后查询,默认求并集(or)

# match查询  
# 如果查询的是keyword类型数据,那么完全匹配的数据也能被查询,比如有个keyword字段的值是“问题查询”,那么
# macth查询的时候“问题”、“查询”都不能查到该数据,但“问题查询”可以查到。
# 还有一个matchphrase,查询keyword类型数据与match一样,查询text类型数据时,
# match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。
# 例如,用“i am Chinese”查询时,“i am”、“ am Chinese”都能匹配,但“i Chinese”、“Chinese am” 不能匹配。
# 它与后面的queryString的区别就是后者不要求顺序
# 可参考https://blog.csdn.net/albertfly/article/details/100705554
# 如果是查询的是nested嵌套对象里的字段可参考:https://learnku.com/articles/54331
GET goods/_search
{
  "query": {
    "match": {
      "title": "华为手机"
    }
  },
  "size": 500
}

#可以指定为and操作
GET goods/_search
{
  "query": {
    "match": {
      "title": {
        "query":  "华为手机",
        "operator": "and"//交集
      }
    }
  }
}

4.分词器

ES默认的分词器对中文不友好,需要安装IKAnalyzer插件支持中文分词。

IK分词器有两种分词模式:

  • ik_max_word,将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。
  • ik_smart,将文本做最粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。
#可以通过以下命令来查看分词效果

GET /_analyze
{
  "analyzer": "standard",
  "text": "我爱北京天安门"
}

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "我爱北京天安门"
}

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "我爱北京天安门"
}

5.匹配查询


# wildcard 查询。查询条件分词,模糊查询,查询的字段既可以是keyword也可以是text
# 如果title是text类型数据,那么查询时会对“华为”进行分词,导致查询结果不正确,甚至查询不到结果,此时可以使用fileds给title
# 添加一个keyword类型的别名,然后用title.别名 查询
GET goods/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "华为*"
      }
    }
  }
}

# 正则查询
GET goods/_search
{
  "query": {
    "regexp": {
      "title": "\\w+(.)*"
    }
  }
}

# 前缀查询,与item查询的区别是keyword类型的数据用使用第一个字的话,前缀查询可以查到,用item查询无结果
GET goods/_search
{
  "query": {
    "prefix": {
      "brandName": {
        "value": "三"
      }
    }
  }
}

6.范围查询

# 范围查询
GET goods/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 2000,
        "lte": 3000
      }
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

7.querystring

# queryString,类似于mysql里的条件查询
# 对于keyword类型的数据,需要完全匹配才能查询到
# 对于text类型的数据,会根据分词结果查询。

GET goods/_search
{
  "query": {
    "query_string": {
      "fields": ["title","categoryName","brandName"], 
      "query": "华为手机"//将"华为手机"分词后依次从"title","categoryName","brandName"
      								//三个属性中查询,默认是and,可以写成“华为 or 手机”
    }
  }
}


GET goods/_search
{
  "query": {
    "simple_query_string": {
      "fields": ["title","categoryName","brandName"], 
      "query": "华为手机"//不支持and or 连接符
    }
  }
}

8.布尔查询

# boolquery 布尔查询
#must(and):条件必须成立
#must_not(not):条件必须不成立
#should(or):条件可以成立
#filter:条件必须成立,性能比must高。不会计算得分,可以用constant_score包裹查询条件,用boost指定分数(Float)
#es相关度计算参考https://blog.csdn.net/miaomiao19971215/category_9729020.html,
# https://blog.csdn.net/ma15732625261/article/details/79537287
#must,filter内按照正常的查询写即可,利用exist可判断字段是否为null或不存在,,如果是嵌套nested类型可参考
# https://blog.csdn.net/TinyNasubi/article/details/101285893,其中的path属性就是对象名
GET goods/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "brandName": {
              "value": "华为"
            }
          }
        }
      ],
      "filter":[ 
        {
        "term": {
          "title": "手机"
        }
       },
       {
         "range":{
          "price": {
            "gte": 2000,
            "lte": 3000
         }
         }
       }
      
      ]
    }
  }
}

GET goods/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "brandName": {
              "value": "华为"
            }
          }
        }
      ]
    }
  }
}

9.聚合查询

指标聚合,相当于MySQL的聚合函数。max、min、avg、sum等
桶聚合,相当于MySQL的 group by 操作。不要对text类型的数据进行分组,会失败。

# 聚合查询,注意!!!聚合结果在正常的查询结果后面的aggregation部分

# 指标聚合 聚合函数

GET goods/_search
{
  "query": {//查询部分
    "match": {
      "title": "手机"
    }
  },
  "aggs": {//聚合部分
    "max_price": {//聚合结果别名
      "max": {//指标聚合类型
        "field": "price"//字段类型要为number
      }
    }
  }
}

# 桶聚合  分组

GET goods/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  },
  "aggs": {
    "goods_brands": {//别名
      "terms": {
        "field": "brandName",//桶聚合字段
        "size": 10//分组结果中展示的数量,比如按brandName分组共有20组,这个设置就是在结果中显示10组
      }
    }
  }
}

10.高亮查询

# !!!结果在最后的highlight部分,对结果中title属性值的“电视”俩字加前后缀
GET goods/_search
{
  "query": {
    "match": {
      "title": "电视"
    }
  },
  "highlight": {
    "fields": {
      "title": {//字段名
        "pre_tags": "<font color='red'>",//默认的前后缀是<em></em>
        "post_tags": "</font>"
      }
    }
  }
}

# 也有这样写的,这种写法kibana里会有提示
GET goods/_search
{
  "query": {
    "match": {
      "title": "电视"
    }
  },
  "highlight": {
    "fields": {
      "title": {}
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": 10
  }
}

11.修改索引映射结构

# -------重建索引-----------

# 新建student_index_v1。索引名称必须全部小写

PUT student_index_v1
{
  "mappings": {
    "properties": {
      "birthday":{
        "type": "date"
      }
    }
  }
}

GET student_index_v1

PUT student_index_v1/_doc/1
{
  "birthday":"1999-11-11"
}


GET student_index_v1/_search


PUT student_index_v1/_doc/1
{
  "birthday":"1999年11月11日"
}

# 业务变更了,需要改变birthday字段的类型为text

# 1. 创建新的索引 student_index_v2
# 2. 将student_index_v1 数据拷贝到 student_index_v2

# 创建新的索引 student_index_v2
PUT student_index_v2
{
  "mappings": {
    "properties": {
      "birthday":{
        "type": "text"
      }
    }
  }
}
# 将student_index_v1 数据拷贝到 student_index_v2
# _reindex 拷贝数据
POST _reindex
{
  "source": {
    "index": "student_index_v1"
  },
  "dest": {
    "index": "student_index_v2"
  }
}

GET student_index_v2/_search



PUT student_index_v2/_doc/2
{
  "birthday":"1999年11月11日"
}



# 思考: 现在java代码中操作es,还是使用的实student_index_v1老的索引名称。
# 1. 改代码(不推荐)
# 2. 索引别名(推荐)

# 步骤:
# 0. 先删除student_index_v1
# 1. 给student_index_v2起个别名 student_index_v1



# 先删除student_index_v1
DELETE student_index_v1
# 给student_index_v2起个别名 student_index_v1
POST student_index_v2/_alias/student_index_v1


GET student_index_v1/_search
GET student_index_v2/_search

有关Kibana常用查询命令的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  5. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. ruby - 从 Ruby : capturing the output while displaying the output? 运行 shell 命令 - 2

    我有一个问题。我想从另一个ruby​​脚本运行一个ruby​​脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密

  8. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  9. ruby - 在 Ruby 的 if 语句中检查 bash 命令 - 2

    如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最

  10. ruby - 可以正常中断的来自 Rake 的长时间运行的 shell 命令? - 2

    在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa

随机推荐