首页 > 其他分享 >ElasticSearch基本使用姿势二

ElasticSearch基本使用姿势二

时间:2022-11-02 22:00:52浏览次数:86  
标签:姿势 基本 index url field second cost ElasticSearch size


ElasticSearch基本使用姿势二

本文作为elasticsearch 基本使用姿势第二篇,包含以下内容

  • 查询指定字段
  • 限制返回条数
  • 分页查询
  • 分组查询
  • 高亮
  • 自动补全提示
  • 排序
  • 返回结果聚合,如统计文档数,某个field value的求和、平均值等

更多相关知识点请查看: * ​​ElasticSearch 基本使用姿势 - 一灰灰Blog​

0. 数据准备

初始化一个索引,写入一些测试数据

post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:08",
"url": "/test",
"execute": {
"args": "id=10&age=20",
"cost": 10,
"res": "test result"
},
"response_code": 200,
"app": "yhh_demo"
}


post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/test",
"execute": {
"args": "id=20&age=20",
"cost": 11,
"res": "test result2"
},
"response_code": 200,
"app": "yhh_demo"
}


post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:10",
"url": "/test",
"execute": {
"args": "id=10&age=20",
"cost": 12,
"res": "test result2"
},
"response_code": 200,
"app": "yhh_demo"
}


post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/hello",
"execute": {
"args": "tip=welcome",
"cost": 2,
"res": "welcome"
},
"response_code": 200,
"app": "yhh_demo"
}

post second-index/_doc
{
"@timestamp": "2021-06-10 08:08:09",
"url": "/404",
"execute": {
"args": "tip=welcome",
"cost": 2,
"res": "xxxxxxxx"
},
"response_code": 404,
"app": "yhh_demo"
}

1. 查询指定字段

比如我现在只关心url返回的状态码, 主要借助​​_source​​来指定需要查询的字段,查询的语法和之前介绍的一致

GET second-index/_search
{
"_source": [
"url",
"response_code"
],
"query": {
"match_all": {}
}
}

ElasticSearch基本使用姿势二_最小值

2. 返回条数限制

针对返回结果条数进行限制,属于比较常见的case了,在es中,直接通过​​size​​来指定

GET second-index/_search
{
"query": {
"match_all": {}
},
"size": 2
}

ElasticSearch基本使用姿势二_字段_02

3. 分页查询

通过size限制返回的文档数,通过from来实现分页

GET second-index/_search
{
"query": {
"match_all": {}
},
"size": 1,
"from": 1
}

(注意下面输出截图,与上面的对比,这里返回的是第二条数据)

ElasticSearch基本使用姿势二_最小值_03

4. 分组查询

相当于sql中的​​group by​​,常用于聚合操作中的统计计数的场景

在es中,使用​​aggs​​来实现,语法如下

"aggs": {
"agg-name": { // 这个agg-name 是自定义的聚合名称
"terms": { // 这个terms表示聚合的策略,根据 field进行分组
"field": "",
"size": 10
}
}
}

比如我们希望根据url统计访问计数,对应的查询可以是

GET second-index/_search
{
"query": {
"match_all": {}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url",
"size": 2
}
}
}
}

但是在执行时,会发现并不能正常响应

右边返回的提示信息为​​Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [url] in order to load field data by uninverting the inverted index. Note that this can use significant memory​​这个异常

简单来说,就是url这个字段为text类型,默认情况下这种类型的不走索引,不支持聚合排序,如果需要则需要设置​​fielddata=true​​​,或者使用url的分词​​url.keyword​

GET second-index/_search
{
"query": {
"match_all": {}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url.keyword",
"size": 2
}
}
}
}

ElasticSearch基本使用姿势二_最小值_04

注意

  • 虽然我们更注重的是分组后的结果,但是​​hits​​中依然会返回命中的文档,若是只想要分组后的统计结果,可以在查询条件中添加 ​​size:0​
  • 聚合操作和查询条件是可以组合的,如只查询某个url对应的计数
GET second-index/_search
{
"query": {
"term": {
"url.keyword": {
"value": "/test"
}
}
},
"size": 1,
"aggs": {
"my-agg": {
"terms": {
"field": "url.keyword",
"size": 2
}
}
}
}


上面介绍了TEXT类型的field,根据分词进行聚合操作;还有一种方式就是设置​​fielddata=true​​,操作姿势如下

PUT second-index/_mapping
{
"properties": {
"url": {
"type": "text",
"fielddata": true
}
}
}

修改完毕之后,再根据url进行分组查询,就不会抛异常了

ElasticSearch基本使用姿势二_搜索引擎_05

5. 全文搜索

通过配置一个动态索引模板,将所有的field构建一个用于全文检索的field,从而实现全文搜索

6. 聚合操作

上面的分组也算是聚合操作中的一种,接下来仔细看一下es的聚合,可以支持哪些东西

聚合语法:

"aggs": {
"agg_name": { // 自定义聚合名
"agg_type": { // agg_type聚合类型, 如 min, max
"agg_body" // 要操作的计算值
},
"meta": {},
"aggregations": {} // 子聚合查询
}
}

从聚合分类来看,可以划分为下面几种

  • Metric Aggregation: 指标分析聚合
  • Bucket Aggregation: 分桶聚合
  • Pipeline: 管道分析类型
  • Matrix: 矩阵分析类型

5.1 Metric Aggregation: 指标分析聚合

常见的有 ​​min, max, avg, sum, cardinality, value count​

通常是值查询一些需要通过计算获取到的值

下面分别给出一些演示说明

5.1.1 min最小值

获取请求耗时最小的case

GET second-index/_search
{
"size": 0,
"aggs": {
"min_cost": {
"min": {
"field": "execute.cost"
}
}
}
}
  • size: 0 表示不需要返回原数据
  • min_cost: 自定义的聚合名
  • min: 表示聚合类型,为取最小值
  • ​"field": "execute.cost"​​​: 表示取的是​​Field: execute.cost​​的最小值

ElasticSearch基本使用姿势二_字段_06

5.1.2 max 最大值

基本同上,下面中贴出请求代码,截图就省略掉了

GET second-index/_search
{
"size": 0,
"aggs": {
"max_cost": {
"max": {
"field": "execute.cost"
}
}
}
}
5.1.3 sum 求和
GET second-index/_search
{
"size": 0,
"aggs": {
"sum_cost": {
"sum": {
"field": "execute.cost"
}
}
}
}
5.1.4 avg平均值

在监控平均耗时的统计中,这个还是比较能体现服务的整体性能的

GET second-index/_search
{
"size": 0,
"aggs": {
"avg_cost": {
"avg": {
"field": "execute.cost"
}
}
}
}
5.1.5 cardinality 去重统计计数

这个等同于我们常见的 ​​distinct count​​​ 注意与后面的 ​​value count​​ 统计所有有值的文档数量之间的区别

GET second-index/_search
{
"_source": "url",
"aggs": {
"cardinality_cost": {
"cardinality": {
"field": "url"
}
}
}
}

去重统计url的计数,如下图,可以看到返回统计结果为3,但是实际的文档数有5个

ElasticSearch基本使用姿势二_搜索引擎_07

5.1.6 value count 计数统计

文档数量统计,区别于上面的去重统计,这里返回的是全量

GET second-index/_search
{
"size": 0,
"aggs": {
"count_cost": {
"value_count": {
"field": "url"
}
}
}
}

输出结果配合cardinality的返回,做一个对比可以加强理解

ElasticSearch基本使用姿势二_elasticsearch_08

5.1.7 stats 多值计算

一个stats 可以返回上面​​min,max,sum...​​等的计算值

GET second-index/_search
{
"size": 0,
"aggs": {
"mult_cost": {
"stats": {
"field": "execute.cost"
}
}
}
}

ElasticSearch基本使用姿势二_最小值_09

5.1.8 extended_stats 多值扩展

在上面stats的基础上进行扩展,支持方差,标准差等返回

GET second-index/_search
{
"size": 0,
"aggs": {
"mult_cost": {
"extended_stats": {
"field": "execute.cost"
}
}
}
}

ElasticSearch基本使用姿势二_最小值_10

5.1.9 percentile 百分位数统计

用于统计 xx% 的记录值,小于等于右边

如下面截图,可知 99%的记录,耗时小于12

ElasticSearch基本使用姿势二_字段_11

默认的百分比区间是: ​​[1, 45, 25, 50, 75, 95, 99]​​, 可以手动修改

GET second-index/_search
{
"size": 0,
"aggs": {
"agg_cost": {
"percentiles": {
"field": "execute.cost",
"percents": [
10,
50,
90,
99
]
}
}
}
}
5.1.10 percentile rank统计值所在的区间

上面用于统计不同区间的占比,比如公司的人员年龄分布;而这一个则是我想知道18岁的我,在哪个占比里

GET second-index/_search
{
"size": 0,
"aggs": {
"agg_cost": {
"percentile_ranks": {
"field": "execute.cost",
"values": [6, 9]
}
}
}
}

ElasticSearch基本使用姿势二_最小值_12

相关博文

​​ElasticSearch:aggregations 聚合详解​​

​Elasticsearch 聚合分析深入学习​

​Elasticsearch: 权威指南-聚合​

一灰灰的联系方式

尽信书则不如无书,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激


标签:姿势,基本,index,url,field,second,cost,ElasticSearch,size
From: https://blog.51cto.com/u_3408236/5818395

相关文章

  • nginx 基本配置
    server{listen443ssl;server_nameexsi.yxdict.com;ssl_certificate/home/zzywb/ssl/exsi.yx.com_bundle.pem;ssl_certificate_key/home/zzywb......
  • 核磁共振成像学习笔记——基本加权成像方式
    对核磁共振成像而言,最为基本的加权成像包括T1-weighted(T1W),T2-weighted(T2W),protondensity(PDW)。T1:是所谓的纵向弛豫时间,就是说你把质子磁化弄到z轴负向后,他要花......
  • Doker学习01-Docker的基本概念
    Doker学习01-Docker的基本概念Docker概述Docker出现的原因一款产品有两个环境:开发(开发环境)和上线(运维环境)。环境配置和切换过于麻烦,每一台机器都要部署环境(集群Redis,E......
  • 实战小技巧19:List转Map List的几种姿势
    今天介绍一个实用的小知识点,如何将List转为​​Map<Object,List<Object>>​​1.基本写法最开始介绍的当然是最常见、最直观的写法,当然也是任何限制的写法//比如将下面的......
  • C++——sqrt函数基本使用方法
    一、sqrt函数作用sqrt是用来求一个数的开根的,等同于开根号。二、使用时需要的头文件#include<cmath> 三、基本用法及注意事项sqrt(需要开根的内容)sqrt函数只能对dou......
  • 面向对象基本知识了解
    今日内容详细面向对象核心思路前戏之人狗大战编写代码简单的实现人打狗狗咬人的小游戏(剧情需要)"""推导步骤1:代码定义出人和狗"""person1={ 'name':'jason', ......
  • Python模块之paramiko的基本使用
    简介paramiko是一个基于SSHv2协议的纯Python(2.7,3.4+)库;提供了客户端和服务器的功能;可以实现SSH2远程安全连接,支持认证和密钥方式;一般用于执行远程命令、传输文件、中间......
  • 《一个最基本的问题》 回复
    《一个最基本的问题》     https://tieba.baidu.com/p/8116618216  回复8楼 @小小泡泡飘飘  ,    你设计飞机也好,  做什么也好,  你说......
  • 顺序表的基本操作_F_hawk189_新浪博客
    程序要求:建立一个顺序表,用户通过输入个数和一组非递减顺序的数,即顺序表按照非递减顺序排列,对顺序表进行建立,删除指定位置的数,查找指定位置的数,插入一个数字功能。程序代码如......
  • DOM 优化原理与基本实践
    DOM为什么这么慢因为收了“过路费”把DOM和JavaScript各自想象成一个岛屿,它们之间用收费桥梁连接。——《高性能JavaScript》JS是很快的,在JS中修改DOM对......