ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Elasticsearch 入门(1):基本概念,安装教程,索引的创建,查询,删除,主键查询,修改,添加,聚合查询,条件查询

2021-11-07 21:00:44  阅读:183  来源: 互联网

标签:category index shopping 9200 price 查询 Elasticsearch http 主键


Elasticsearch 入门

基本概念

The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为 ES,

  • ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack 技术栈的核心。
  • 它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。

常规全文搜索性能较差场景

  • 搜索的数据对象是大量的非结构化的文本数据
  • 文件记录量达到数十万或数百万个甚至更多。
  • 支持大量基于交互式文本的查询。
  • 需求非常灵活的全文搜索查询。
  • 对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足
  • 对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。
  • 为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎 。

官方网址

  • 官方网址
  • 官方文档

直接下载,然后解压缩即可,文件目录如下:

目录含义
bin可执行脚本目录
config配置目录
jdk内置 JDK 目录
lib类库
logs日志目录
modules模块目录
plugins插件目录
  • 解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务 。
  • 注意: 9300 端口为 Elasticsearch 集群间组件的通信端口, 9200 端口为浏览器访问的 http协议 RESTful 端口。
  • 注意 elasticsearch 的文件路径不能有中文,否则会报错!!
    在这里插入图片描述

Elasticsearch 基本操作

RESTful

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是:

  • 客户端和服务器之间的交互在请求之间是无状态的。
  • 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。
  • 如果服务器在请求之间的任何时间点重启,客户端不会得到通知。
  • 此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。

在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。

  • 这些方法都是标准方法,包括 HTTP GET、 POST、PUT、 DELETE,还可能包括 HEAD 和 OPTIONS。
  • 简单的理解就是,如果想要访问互联网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径, 以及对资源进行的操作(增删改查)。
  • REST 样式的 Web 服务若有返回结果,大多数以JSON字符串形式返回。
  • 可以使用 Postman 进行不同HTTP请求的模拟。可以通过该软件提交表单并且附带任意类型的请求体。

数据格式-倒排索引

  • 正排索引(传统):

    idcontent
    1001my name is zhang san
    1002my name is li si
  • 倒排索引

    keywordid
    name1001, 1002
    zhang1001

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。 为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比
在这里插入图片描述

HTTP-索引-创建-查询&删除

创建索引

对比关系型数据库,创建索引就等同于创建数据库。
在 Postman 中,向 ES 服务器发 PUT 请求http://127.0.0.1:9200/shopping
请求后,服务器返回响应:
在这里插入图片描述

  • 相当于说 PUT 请求用于创建索引
    {
        "acknowledged": true,//响应结果
        "shards_acknowledged": true,//分片结果
        "index": "shopping"//索引名称
    }
    

后台日志:

[2021-04-08T13:57:06,954][INFO ][o.e.c.m.MetadataCreateIndexService] [DESKTOP-LNJQ0VF] [shopping] creating index, cause [api], templates [], shards [1]/[1], mappings []

如果重复发 PUT 请求 : http://127.0.0.1:9200/shopping 添加索引,会返回错误信息 :

{
    "error": {
        "root_cause": [
            {
                "type": "resource_already_exists_exception",
                "reason": "index [shopping/J0WlEhh4R7aDrfIc3AkwWQ] already exists",
                "index_uuid": "J0WlEhh4R7aDrfIc3AkwWQ",
                "index": "shopping"
            }
        ],
        "type": "resource_already_exists_exception",
        "reason": "index [shopping/J0WlEhh4R7aDrfIc3AkwWQ] already exists",
        "index_uuid": "J0WlEhh4R7aDrfIc3AkwWQ",
        "index": "shopping"
    },
    "status": 400
}

查看全部索引

  • 在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/_cat/indices?v

  • 这里请求路径中的_cat 表示查看的意思, indices 表示索引,所以整体含义就是查看当前 ES服务器中的所有索引,就好像 MySQL 中的 show tables的感觉,服务器响应结果如下 :

    health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    yellow open   shopping J0WlEhh4R7aDrfIc3AkwWQ   1   1          0            0       208b           208b	
    
    含义
    ealth当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
    tatus索引打开、关闭状态
    ndex索引名
    uid索引统一编号
    ri主分片数量
    ep副本数量
    ocs.count可用文档数量
    ocs.deleted文档删除状态(逻辑删除)
    tore.size主分片和副分片整体占空间大小
    ri.store.size主分片占空间大小

查看单个索引:

  • 在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping
    {
        "shopping": {//索引名
            "aliases": {},//别名
            "mappings": {},//映射
            "settings": {//设置
                "index": {//设置 - 索引
                    "creation_date": "1617861426847",//设置 - 索引 - 创建时间
                    "number_of_shards": "1",//设置 - 索引 - 主分片数量
                    "number_of_replicas": "1",//设置 - 索引 - 主分片数量
                    "uuid": "J0WlEhh4R7aDrfIc3AkwWQ",//设置 - 索引 - 主分片数量
                    "version": {//设置 - 索引 - 主分片数量
                        "created": "7080099"
                    },
                    "provided_name": "shopping"//设置 - 索引 - 主分片数量
                }
            }
        }
    }
    

删除某个索引

  • 在 Postman 中,向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping
    返回结果如下:

    {
        "acknowledged": true
    }
    
  • 再次查看所有索引,GET http://127.0.0.1:9200/_cat/indices?v,返回结果如下:

    health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
    

    成功删除。

HTTP-文档操作

利用 Put & Post 创建文档

假设索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式

  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/phone,请求体 JSON 内容为:

    {
        "title":"小米手机",
        "category":"小米",
        "images":"http://www.gulixueyuan.com/xm.jpg",
        "price":3999.00
    }
    

    在这里插入图片描述

    注意: 此处发送请求的方式必须为 POST,不能是 PUT,否则会发生错误 。
    返回结果:

    {
        "_index": "shopping", 【索引】
        "_type": "phone",【文档类型】
        "_id": "_KEi-XwBo-TVi9pGGySn",【如果没有指定id,会随机产生一个唯一标识】
        "_version": 1,【版本】
        "result": "created",【这里的 create 表示创建成功】
        "_shards": {【分片】
            "total": 2,【分片总数】
            "successful": 1,【分片-成功】
            "failed": 0【分片-失败】
        },
        "_seq_no": 3,
        "_primary_term": 2
    }
    
  • 如果指定利用POST请求时指定标志,http://127.0.0.1:9200/shopping/phone/1
    body为:

    {
        "title":"小米手机",
        "category":"小米",
        "images":"http://www.gulixueyuan.com/xm.jpg",
        "price":3999.00
    }
    
    

    结果如下:

     {
       "_index": "shopping",
       "_type": "phone",
       "_id": "1",
       "_version": 1,
       "result": "created",
       "_shards": {
           "total": 2,
           "successful": 1,
           "failed": 0
       },
       "_seq_no": 4,
       "_primary_term": 2
    }
    

主键查询 & 全查询

查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询。

主键查询:

  • 在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping/phone/1。返回结果如下:
    {
        "_index": "shopping",
        "_type": "phone",
        "_id": "1",
        "_version": 1,
        "_seq_no": 4,
        "_primary_term": 2,
        "found": true,
        "_source": {
            "title": "小米手机",
            "category": "小米",
            "images": "http://www.gulixueyuan.com/xm.jpg",
            "price": 3999
        }
    }
    
  • 如果查找的id不存在,如http://127.0.0.1:9200/shopping/phone/1001 ,则返回的结果如下:
    {
        "_index": "shopping",
        "_type": "_doc",
        "_id": "1001",
        "found": false
    }
    

全查询:

  • 查看索引下所有数据,向 ES 服务器发 GET 请求(关键字_search) : http://127.0.0.1:9200/shopping/_search
    在这里插入图片描述

全量修改 & 局部修改 & 删除

全量修改

和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖。 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/phone/1

请求体JSON内容改为想要修改的内容即可:

{
   "title":"华为手机",
   "category":"华为",
   "images":"http://www.gulixueyuan.com/hw.jpg",
   "price":1999.00
}

修改成功后,服务器响应结果:

{
    "_index": "shopping",
    "_type": "_doc",
    "_id": "1",
    "_version": 2,
    "result": "updated",//<-----------updated 表示数据被更新
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 1
}

局部修改

修改数据时,使用 _update 修改某一给条数据的局部信息

  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/phone/1。请求体的内容不写全即可:
    {
    	"phone": {
    		"title":"小米手机",
    		"category":"小米"
    	}
    }
    
  • 返回结果如下:
    {
        "_index": "shopping",
        "_type": "phone",
        "_id": "1",
        "_version": 3,
        "result": "updated",//<-----------updated 表示数据被更新
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 3,
        "_primary_term": 1
    }
    
    
  • 在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/phone/1,查看修改内容:
    {
        "_index": "shopping",
        "_type": "phone",
        "_id": "1",
        "_version": 3,
        "_seq_no": 3,
        "_primary_term": 1,
        "found": true,
        "_source": {
            "title": "小米手机",
            "category": "小米",
            "images": "http://www.gulixueyuan.com/hw.jpg",
            "price": 1999
        }
    }
    
    

文档的删除

传统删除文档
删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)

  • 在 Postman 中,向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping/phone/1
  • 结果返回:
    {
        "_index": "shopping",
        "_type": "_doc",
        "_id": "1",
        "_version": 4,
        "result": "deleted",//<---删除成功
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 4,
        "_primary_term": 1
    }
    
  • 在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping/phone/1,查看是否删除成功:
    {
        "_index": "shopping",
        "_type": "_doc",
        "_id": "1",
        "found": false
    }
    

条件删除文档

  • 一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数据进行删除。注意此时使用的是POST
    命令为 http://127.0.0.1:9200/shopping/_delete_by_query
    {
     "query":{
    	 "match":{
    	 	"price":4000.00
    	 }
     }
    }
    
  • 结果如下:
    在这里插入图片描述

条件查询

传统条件查询

条件查询使用 _search?关键词 的筛选方式

  • 不带参数时,即为全查询: 在 Postman 中,向 ES 服务器发 GET请求 :http://127.0.0.1:9200/shopping/_search):

    {
        "took": 5, 【划分时间,单位毫秒】
        "timed_out": false,【是否超时】
        "_shards": {【分片信息】
            "total": 1,【总数】
            "successful": 1,【成功】
            "skipped": 0,【忽略】
            "failed": 0【失败】
        },
        "hits": {
            "total": {
                "value": 6,
                "relation": "eq"
            },
            "max_score": 1,
            "hits": [
                {
                    "_index": "shopping",
                    "_type": "_doc",
                    "_id": "ANQqsHgBaKNfVnMbhZYU",
                    "_score": 1,
                    "_source": {
                        "title": "小米手机",
                        "category": "小米",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 3999
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "_doc",
                    "_id": "A9R5sHgBaKNfVnMb25Ya",
                    "_score": 1,
                    "_source": {
                        "title": "小米手机",
                        "category": "小米",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 1999
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "_doc",
                    "_id": "BNR5sHgBaKNfVnMb7pal",
                    "_score": 1,
                    "_source": {
                        "title": "小米手机",
                        "category": "小米",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 1999
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "_doc",
                    "_id": "BtR6sHgBaKNfVnMbX5Y5",
                    "_score": 1,
                    "_source": {
                        "title": "华为手机",
                        "category": "华为",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 1999
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "_doc",
                    "_id": "B9R6sHgBaKNfVnMbZpZ6",
                    "_score": 1,
                    "_source": {
                        "title": "华为手机",
                        "category": "华为",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 1999
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "_doc",
                    "_id": "CdR7sHgBaKNfVnMbsJb9",
                    "_score": 1,
                    "_source": {
                        "title": "华为手机",
                        "category": "华为",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 1999
                    }
                }
            ]
        }
    }
    
  • URL带参查询:
    查找 category 为小米的文档,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search?q=category:小米,(其中 q 表示 query 的意思)。返回结果如下:

    {
       "took": 3,
       "timed_out": false,
       "_shards": {
           "total": 1,
           "successful": 1,
           "skipped": 0,
           "failed": 0
       },
       "hits": {
           "total": {
               "value": 5,
               "relation": "eq"
           },
           "max_score": 0.17402273,
           "hits": [
               {
                   "_index": "shopping",
                   "_type": "phone",
                   "_id": "-aEc-XwBo-TVi9pGjSRH",
                   "_score": 0.17402273,
                   "_source": {
                       "title": "小米手机",
                       "category": "小米",
                       "images": "http://www.gulixueyuan.com/xm.jpg",
                       "price": 3999
                   }
               },
               {
                   "_index": "shopping",
                   "_type": "phone",
                   "_id": "-6Eh-XwBo-TVi9pGliRB",
                   "_score": 0.17402273,
                   "_source": {
                       "title": "小米手机",
                       "category": "小米",
                       "images": "http://www.gulixueyuan.com/xm.jpg",
                       "price": 3999
                   }
               }
           ]
       }
    }
    
  • 请求体带参查询
    由于编码以及安全问题,一般不会在url中直接带参,可以使用body传递条件. 在 Postman 中,向 ES 服务器发 POST请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

    {
    	"query":{
    		"match":{
    			"category":"小米"
    		}
    	}
    }
    

    返回结果如下(注意,由于此时GET无法传递body,因此所有传递body的请求都因为POST请求。然后根据索引后面的关键词判断请求类型):
    在这里插入图片描述

  • 请求体带参查找所有文档内容
    查找所有文档内容,也可以这样,在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

    {
    	"query":{
    		"match_all":{}
    	}
    }
    
  • 请求体带参查询指定字段的数据:
    如果你想查询指定字段,在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带 JSON 体如下:

    {
    	"query":{
    		"match_all":{}
    	},
    	"_source":["title"]
    }
    

分页查询:

  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
    {
    	"query":{
    		"match_all":{}
    	},
    	"from":0,//
    	"size":2
    }
    
    在这里插入图片描述
    此时结果只显示了两条,即from 和 to 可以理解为第几条

查询排序

  • 在body中添加 order 关键词
    {
    	"query":{
    		"match_all":{}
    	},
    	"sort":{
    		"price":{
    			"order":"asc"
    		}
    	}
    }
    
  • 结果如下:
    在这里插入图片描述

多条件查询

且逻辑查询:must

  • 假设想找出小米牌子,价格为3999元的, 使用 must 关键词来连接,must相当于数据库的&&
  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
    {
    	"query":{
    		"bool":{
    			"must":[{
    				"match":{
    					"category":"小米"
    				}
    			},{
    				"match":{
    					"price":3999.00
    				}
    			}]
    		}
    	}
    }
    
    结果如下:
    在这里插入图片描述

或逻辑查询:should

  • 假设想找出小米和华为的牌子。should相当于数据库的||

  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

    	{
    	"query":{
    		"bool":{
    			"should":[{
    				"match":{
    					"category":"小米"
    				}
    			},{
    				"match":{
    					"category":"华为"
    				}
    			}]
    		}
    	}
    }
    

    在这里插入图片描述

范围查询

  • 范围查询使用 filter[range] 关键词
  • 假设想找出小米和华为的牌子,价格大于2000元的手机。
  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
    {
    	"query":{
    		"bool":{
    			"should":[{
    				"match":{
    					"category":"小米"
    				}
    			},{
    				"match":{
    					"category":"华为"
    				}
    			}],
                "filter":{
                	"range":{
                    	"price":{
                        	"gt":2000
                    	}
    	            }
        	    }
    		}
    	}
    }
    
    

全文检索

  • 即搜索除最相关的数据,比如关键词为 “小华” 则会输出小米和华为。如果关键词为“米华”,则输出小米,华为和红米
  • 全文检索直接使用 _search 关键词就可以完成,http://127.0.0.1:9200/shopping/_search
{
	"query":{
		"match":{
			"category" : "小华"
		}
	}
}

完全匹配

  • 使用 match_phrase 完成完全匹配,词中的每一字都能够得到匹配
  • 代码如下:
{
	"query":{
		"match_phrase":{
			"category" : "为"
		}
	}
}

高亮查询

  • 即搜索出来的结果某个字段或某些字与其他字的颜色不同
    在这里插入图片描述

  • 我们可以使用 highlight"->"fields" 实现高亮设置:

    {
    	"query":{
    		"match_phrase":{
    			"category" : "为"
    		}
    	},
        "highlight":{
            "fields":{
                "category":{}//<----高亮这字段
            }
        }
    }
    
    

    结果如下:

    	{
        "took": 1,
        "timed_out": false,
        "_shards": {
            "total": 1,
            "successful": 1,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": {
                "value": 1,
                "relation": "eq"
            },
            "max_score": 1.2039728,
            "hits": [
                {
                    "_index": "shopping",
                    "_type": "phone",
                    "_id": "DaGU-XwBo-TVi9pGESXa",
                    "_score": 1.2039728,
                    "_source": {
                        "title": "华为手机",
                        "category": "华为",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 2000
                    },
                    "highlight": {
                        "category": [
                            "华<em>为</em>"
                        ]
                    }
                }
            ]
        }
    }
    

聚合查询

聚合查询允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值max、平均值avg等等。

  • 按 price 字段进行分组: 使用 agg 指明分组操作,使用 terms 指定分组字段
    在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

    {
    	"aggs":{//聚合操作
    		"price_group":{//名称,随意起名
    			"terms":{//分组
    				"field":"price"//分组字段
    			}
    		}
    	}
    }
    

    结果如下:

    {
        "took": 15,
        "timed_out": false,
        "_shards": {
            "total": 1,
            "successful": 1,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": {
                "value": 5,
                "relation": "eq"
            },
            "max_score": 1,
            "hits": [
                {
                    "_index": "shopping",
                    "_type": "phone",
                    "_id": "BaGP-XwBo-TVi9pG-SVQ",
                    "_score": 1,
                    "_source": {
                        "title": "小米手机",
                        "category": "小米",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 3999
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "phone",
                    "_id": "BqGP-XwBo-TVi9pG_CVf",
                    "_score": 1,
                    "_source": {
                        "title": "小米手机",
                        "category": "小米",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 3999
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "phone",
                    "_id": "B6GP-XwBo-TVi9pG_iWO",
                    "_score": 1,
                    "_source": {
                        "title": "小米手机",
                        "category": "小米",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 3999
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "phone",
                    "_id": "DaGU-XwBo-TVi9pGESXa",
                    "_score": 1,
                    "_source": {
                        "title": "华为手机",
                        "category": "华为",
                        "images": "http://www.gulixueyuan.com/xm.jpg",
                        "price": 2000
                    }
                },
                {
                    "_index": "shopping",
                    "_type": "phone",
                    "_id": "1",
                    "_score": 1,
                    "_source": {
                        "phone": {
                            "title": "小米手机",
                            "category": "小米"
                        }
                    }
                }
            ]
        },
        "aggregations": {
            "price_group": {
                "doc_count_error_upper_bound": 0,
                "sum_other_doc_count": 0,
                "buckets": [
                    {
                        "key": 3999,
                        "doc_count": 3
                    },
                    {
                        "key": 2000,
                        "doc_count": 1
                    }
                ]
            }
        }
    }
    
  • 上面返回结果会附带原始数据的。
    若不想要不附带原始数据的结果,在 Postman 中,向 ES 服务器发 GET请求 :http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{
	"aggs":{
		"price_group":{
			"terms":{
				"field":"price"
			}
		}
	},
    "size":0
}

  • 若想对所有手机价格求平均值。
    {
    	"aggs":{
    		"price_avg":{//名称,随意起名
    			"avg":{//求平均
    				"field":"price"
    			}
    		}
    	},
        "size":0
    }
    
    
    结果如下:
    {
       "took": 4,
       "timed_out": false,
       "_shards": {
           "total": 1,
           "successful": 1,
           "skipped": 0,
           "failed": 0
       },
       "hits": {
           "total": {
               "value": 5,
               "relation": "eq"
           },
           "max_score": null,
           "hits": []
       },
       "aggregations": {
           "price_avg": {
               "value": 3499.25
           }
       }
    }
    
  • 混合聚合:先分组再求求和
    {
    	"aggs":{
    		"price_group":{
    			"terms":{
    				"field":"price"
    			},
    			"aggs": { // 通过嵌套聚合查询,设置桶内指标聚合条件
                  "sum_price": { // 聚合查询名字
                    "sum": { // 聚合类型为: avg指标聚合
                      "field": "price" // 根据price字段计算平均值
                     }
                   }
       }
    		}
    	},
       "size":0
    }
    
    结果如下:
    在这里插入图片描述

标签:category,index,shopping,9200,price,查询,Elasticsearch,http,主键
来源: https://blog.csdn.net/Mr_tianyanxiaobai/article/details/121150917

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有