内容拷贝:https://blog.csdn.net/jiayoubaobei2/article/details/125882986
1. Elasticsearch概述 1.1 开篇 1.1.1 结构化数据
老师说扩展结构不方便,我也没明白哪里不方便,很方便啊,想增加字段就增加,想删除就删除,如果哪位大佬知道麻烦底下留言指教
1.1.2 非结构化数据
无法用二维表结构来表现数据的数据,比如服务器日志,无法用结构表现,通信记录,视频或者图片,维度广数据量大,数据的查询和存储的成本非常大,往往需要专业的人员的大量的统计模型进行处理,一般这种数据保存到nosql数据库中,如redis,通过key来查询我们数据
1.1.3 半结构化数据
将数据的结构和内容混在一起,没有明显的区分,像xml和html,这样的文档就是半结构化数据,也是一般保存到nosql中,缺点就是查询内容不是很容易
1.3 Elasticsearch是什么
1.3.1 介绍
The Elastic Stack,包括Elasticsearch、Kibana用于展示数据的项目、Beats和Logstash采集和传输数据的项目(也称为ELK stack)
Elaticsearch,简称为 ES, ES 是一个 开源的高扩展的分布式全文搜索引擎, 也可以理解为全栈搜索,比如说在博客网站中,用户在网站里写一些文章,其他用户可以根据热门词汇或者关键字等等,进行搜索,查询整个网站所有匹配的文章,并以列表的形式展现出来,传统数据库以这样的方式检索效率是非常低的,即使进行sql索引优化,效果也不会很明显,所以生产环境中,这种常规搜索方式效果比较差,是整个 ElasticStack 技术栈的核心,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据
1.3.2 全文搜索引擎
Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。
一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。
基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差的
1.搜索的数据对象是大量的非结构化的文本数据。
2.文件记录量达到数十万或数百万个甚至更多。
3.支持大量基于交互式文本的查询。
4.需求非常灵活的全文搜索查询。
5.对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。
6.对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎
这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程
2. Elasticsearch入门
2.1 环境准备
Windows 版的 Elasticsearch 压缩包,解压即安装完毕,解压后的 Elasticsearch 的目录结构如下 :
目录 含义 bin 可执行脚本目录 config 配置目录 jdk 内置 JDK 目录 lib 类库 logs 日志目录 modules 模块目录 plugins 插件目录
解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务 。
注意: 9300 端口为 Elasticsearch 集群间组件的通信端口, 9200 端口为浏览器访问的 http协议 RESTful 端口。
打开浏览器,输入地址: http://localhost:9200,测试返回结果
{
"name" : "LAPTOP-SNNQ1UNH",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "swFLKvuqRBOE0r5GewiUwg",
"version" : {
"number" : "7.14.1",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "66b55ebfa59c92c15db3f69a335d500018b3331e",
"build_date" : "2021-08-26T09:01:05.390870785Z",
"build_snapshot" : false,
"lucene_version" : "8.9.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
2.2 名词解释
2.2.1 Restful & Json
互联网软件的架构原则,这个原则我们称之为rest原则,表示资源状态转换,就是说我们请求的资源是有状态的,而这些状态会根据原则改变和转换,其实我们Http协议就遵循了rest原则,比如在web中资源的唯一标识是URI,叫统一资源路径,我们可以在浏览器输入这个路径,来定位网上的资源,比如http://localhost:9200/test/test.txt,这个路径不应该包含对资源的操作的,比如增加修改,路径是不应该存在的,那rest风格当中就要我们统一遵循接口原则,统一接口就包含了受限制的预定义的操作,无论什么样的资源都应该用同样的接口对资源进行访问,这里的接口就应该符合标准的http的方法,比方说, get,post,put,delete,heade,我们的路径是对资源的定位,方法是对资源的操作,按照http的方法就会暴露我们的资源,我们接口就具有安全性和幂等性的特性,比如get和head的请求都是安全的,无论你请求多少次都不会改变服务器资源的状态,而put,delete这些请求都是幂等性的,无论对资源操作多少次结果都是一样的,后面的请求并不会对第一次请求产生更多的影响,你put插入的东西永远是相同的,post不是幂等性的,当我们用rest风格想es发出请求之后,es就会返回响应,返回响应的数据格式为json,es数据的发送和返回都是以json为标准格式的
2.2.2 数据格式
Elasticsearch 是 面向文档型数据库,一条数据在这里就是一个文档。 为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比
ES 里的 Index 可以看做一个库,而 Types 相当于表, Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化, Elasticsearch 6.X 中,一个 index 下已经只能包含一个type, Elasticsearch 7.X 中, Type 的概念已经被删除了
理解:在关系型数据库中索引是为了优化查询所设计的数据库对象,没有索引也能查询就是慢,而ES软件专门用于全文检索数据,所以索引是搜索引擎的关键,甚至可以说万物皆索引不为过,es为了能够做到快速准确查询,使用特殊概念进行数据的存储和查询,这个概念称之为 倒排索引,我们可以根据主键查询对应信息,通过建立主键索引快速查出对应信息,这种叫 正向索引,如果我们想要查询文章内容中,包含了哪些热门词汇,我们需要做模糊查询,这个查询效率很差,而且每条数据都需要遍历,而且查询内容的大小写,时态都会影响查询的准确率,如果你想查大写,数据中有小写的你查不查,算不算匹配,所以这个时候就需要换一种方式,将数据和索引关联,就需要倒排索引,通过关键字查询主键id,然后再关联文章内容,不会体现表的概念,如果模糊查询的话,他会告诉你,数据在哪张表里面,具体规则是什么,倒排索引中强调的是关键字和文档编号的关联,表的作用没有那么关键了,所以说type概念逐渐弱化,其他的概念还是跟数据库相对应的
- ES操作
3.1 索引操作
3.1.1 创建索引
对比关系型数据库,创建索引就等同于创建数据库,索引是必要的
在 Postman 中,向 ES 服务器发 PUT 请求 : http://127.0.0.1:9200/shopping,127.0.0.1:9200表示ES软件,shopping表示索引名称,注意请求方法
请求后,服务器返回响应:
{
"acknowledged": true,//表示响应成功
"shards_acknowledged": true,
"index": "shopping"
}
如果你再一次发送请求,put请求具有幂等性,你只要发出同样的请求,结果是一样的,表示你刚刚创建成功了吧,你再去创建就会有问题
如果重复发 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
}
3.1.2 索引-查询
查询指定索引信息 http://127.0.0.1:9200/shopping get请求,结果
{
"shopping": {
"aliases": {},
"mappings": {},
"settings": {
"index": {
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_content"
}
}
},
"number_of_shards": "1",
"provided_name": "shopping",
"creation_date": "1658549559292",
"number_of_replicas": "1",
"uuid": "0FEhzMkRSeSvqp_HD1jXpg",
"version": {
"created": "7170399"
}
}
}
}
}
返回的是shopping索引的详细信息
如何查看所有索引呢? http://127.0.0.1:9200/_cat/indices?v 查看所有的索引,?v查看详细信息,_cat查询的意思
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
3.1.3 删除索引
在 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
发送:localhost:9200/shopping get请求
3.2 文档操作
3.2.1 创建文档
假设索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
在 Postman 中,向 ES 服务器发 POST请求 : http://127.0.0.1:9200/shopping/_doc,前面是地址和索引的名称,_doc索引中添加文档数据的意思,添加数据就表示添加文档,需要请求体,请求体JSON内容为
{
"title":"小米手机",
"category":"小米",
"images":"http://www.gulixueyuan.com/xm.jpg",
"price":3999.00
}
注意:请求路径为:http://127.0.0.1:9200/shopping/_doc
此处发送请求的方式必须为 POST,不能是 PUT,否则会发生错误
返回结果:同样的请求,post多次发出,得到的 _id是不同的,说明这个操作不是幂等性的,可是put操作是 幂等性的,所以put请求是不行的
{
"_index": "shopping",//索引
"_type": "_doc",//类型-文档
"_id": "ANQqsHgBaKNfVnMbhZYU",//唯一标识,可以类比为 MySQL 中的主键,es随机生成
"_version": 1,//版本
"result": "created",//结果,这里的 create 表示创建成功
"_shards": {//
"total": 2,//分片 - 总数
"successful": 1,//分片 - 总数
"failed": 0//分片 - 总数
},
"_seq_no": 0,
"_primary_term": 1
}
如果想要自定义唯一性标识,需要在创建时指定: http://127.0.0.1:9200/shopping/_doc/ 1001,后面跟自己的自定义标识,得到的返回结果:
{
"_index": "shopping",
"_type": "_doc",//文本类型
"_id": "1001",//返回的是自定义id
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
此处需要注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT
使用这个路径也可以:
http://127.0.0.1:9200/shopping/ _create/1001 也是可以的(不适用 _doc,使用 _create)
但是这个只能用一次,第二次就会报已存在,除非更改id值
3.2.2 主键查询
查看文档时,需要指明文档的 唯一性标识,类似于 MySQL 中数据的主键查询
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_doc/1001
返回结果如下:。
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"_version": 1,
"_seq_no": 1,
"_primary_term": 1,
"found": true,//查询到数据
"_source": { //数据结果
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999.00
}
}
查找不存在的内容,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping/_doc/1
返回结果如下:
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"found": false//返回false,说明不存在
}
3.2.3 查询索引下所有文档
查看索引下所有id的数据,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/ _search
返回结果如下:
{
"took": 7, //耗费事件
"timed_out": false, //是否超时
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": { //命中结果
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "dRMBKoIB6nXwiib44SNN",
"_score": 1.0,
"_source": {
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999.00
}
},
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"_score": 1.0,
"_source": {
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999.00
}
}
]
}
}
3.2.4 文档修改
完全覆盖
和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖
在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_doc/1001
请求体JSON内容为:
{
"title":"华为手机",
"category":"华为",
"images":"http://www.gulixueyuan.com/hw.jpg",
"price":1999.00
}
修改成功后,服务器响应结果:
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
局部修改
修改数据时,也可以只修改某一给条数据的局部信息
在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/ _update/1001
请求体JSON内容为:
{
"doc": { //数据的意思
"title":"华为手机", //花括号里是写想对谁进行修改
"category":"华为"
}
}
返回结果如下:
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"_version": 2,
"result": "noop",
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_doc/1,查看修改内容:
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"_version": 2,
"_seq_no": 2,
"_primary_term": 1,
"found": true,
"_source": {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 1999.00
}
}
3.2.5 删除文档
删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。
在 Postman 中,向 ES 服务器发 DELETE请求 : http://127.0.0.1:9200/shopping/_doc/1001
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_doc/1001,查看是否删除成功:
{
"_index": "shopping",
"_type": "_doc",
"_id": "1001",
"found": false
}
3.2.6 条件查询
查找category为小米的文档,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search?q=category:小米,这个q就是查询的意思,返回结果如下:
{
"took": 37,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.5753642,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "dRMBKoIB6nXwiib44SNN",
"_score": 0.5753642,
"_source": {
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999.00
}
}
]
}
}
我们发现我们的请求路径比较麻烦,而且中文比较容易乱码,一般会通过请求体来传递参数
接下带JSON请求体,还是 查找category为小米的文档,在 Postman 中,向 ES 服务器发 post请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{
"query":{
"match":{
"category":"小米"
}
}
}
注意如果你用小,或者米进行查询,也可以查到对应数据,因为es采用倒排索引,所有的文字都建立了索引,你用小华,作为条件进行查询,将小米和华为都能查询来,这两个都满足条件,你看是两个文字,他在底层一个一个拆解变成关键词,进行倒排索引的匹配,匹配成功就把数据查询出来
如果想要完全匹配,就需要将match改为match_phrase
全部查询
{
"query":{
"match_all":{}
}
}
3.2.7 分页查询
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下
{
"query":{
"match_all":{}
},
"from":0, //(页码-1)*每页数量
"size":2
}
如何需要查询特定列:
更改请求体为:
{
"query":{
"match_all":{}
},
"from":0,
"size":3,
重点1:加入_source,放入需要查询的字段
"_source":["title", "price"]
}
3.2.8 顺序查询
如果你想通过排序查出价格最高的手机,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下
{
"query":{
"match_all":{}
},
"sort":{
"price":{
"order":"desc"
}
}
}
3.2.10 多条件查询
同时成立
bool表示条件的意思,就是要添加多个条件,多个条件同时成立用 must,多个条件用[]表示
假设想找出小米牌子,价格为3999元的。在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
类似于数据库的and
{
"query":{
"bool":{
"must":[{
"match":{
"category":"小米"
}
},{
"match":{
"price":3999.00
}
}]
}
}
}
不同时成立
用should,表示符合哪个条件都可以,类似于数据库的or,会查询出小米和华为的手机
{
"query":{
"bool":{
"should":[{
"match":{
"category":"小米"
}
},{
"match":{
"category":"华为"
}
}]
}
}
}
3.2.11 范围查询
假设想找出小米和华为的牌子,价格大于2000元的手机。
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:使用 filter range表示范围
{
"query":{
"bool":{
"should":[{
"match":{
"category":"小米"
}
},{
"match":{
"category":"华为"
}
}],
"filter":{
"range":{
"price":{
"gt":2000
}
}
}
}
}
}
3.2.12 高亮显示
就像百度一样,搜索的关键字可以高亮显示,所谓高亮就是加上样式设定
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
{
"query":{
"match_phrase":{
"category" : "为"
}
},
"highlight":{
"fields":{ // 哪些字段需要高亮
"category":{}//<----高亮这字段 } }< code></----高亮这字段>
返回报文:
{
"took": 61,
"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": "_doc",
"_id": "1001",
"_score": 1.2039728,
"_source": {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 4999
},
"highlight": {
"category": [
"华<em>为</em>"
]
}
}
]
}
}
3.2.13 聚合操作
聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值max、平均值avg等等。接下来按price字段进行分组:
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体
{
"aggs":{//聚合操作
"price_group":{//名称,随意起名
"terms":{//分组
"field":"price"//分组字段
}
}
}
}
返回结果:
{
"took": 63,
"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
}
}
]
},
"aggregations": {
"price_group": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 1999,
"doc_count": 5
},
{
"key": 3999,
"doc_count": 1
}
]
}
}
}
上面返回结果会附带原始数据的。若不想要不附带原始数据的结果,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下
{
"aggs":{
"price_group":{
"terms":{
"field":"price"
}
}
},
"size":0
}
返回结果:
{
"took": 60,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"price_group": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 1999,
"doc_count": 5
},
{
"key": 3999,
"doc_count": 1
}
]
}
}
}
3.2.14 平均值
若想对所有手机价格求 平均值。
在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:也是不带原始数据
{
"aggs":{
"price_avg":{//名称,随意起名
"avg":{//求平均
"field":"price"
}
}
},
"size":0
}
3.2.15 映射关系 有了索引库,等于有了数据库中的 database。
接下来就需要建索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。
创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)
先创建一个索引:
PUT http://127.0.0.1:9200/user
创建映射
PUT http://127.0.0.1:9200/user/_mapping
{
"properties": { //告诉数据怎么规定和约束
"name":{//索引具备哪些字段,比如名称
"type": "text",//类型起名叫做文本,可以分词匹配的(文本部分匹配也会被查出)
"index": true//这个字段可以索引查询的
},
"sex":{ //性别,因为我们索引是user,这个user具备的字段
"type": "keyword",//代表该字段是关键字查询,必须完整匹配,部分匹配查询不出
"index": true//这个字段可以索引查询
},
"tel":{
"type": "keyword",//表示不能分词,只能完整匹配
"index": false//代表该字段没有索引,不能索引查询
}
}
}
查询映射
#GET http://127.0.0.1:9200/user/_mapping
返回结果如下:
{
"user": {
"mappings": {
"properties": {
"name": {
"type": "text"
},
"sex": {
"type": "keyword"
},
"tel": {
"type": "keyword",
"index": false
}
}
}
}
}
增加数据,类似于数据库往表中增加数据
#PUT http://127.0.0.1:9200/user/_create/1001
{
"name":"小米",
"sex":"男的",
"tel":"1111"
}
返回结果如下:
{
"_index": "user",
"_type": "_doc",
"_id": "1001",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
name是可以分词的,sex是必须完全匹配,tel不能被索引,不能被查询
1.name分词匹配
2.sex必须完全匹配:
3.tel不能索引查询
Original: https://www.cnblogs.com/wmd-l/p/16622561.html
Author: 努力的达子
Title: 1.Elasticsearch介绍
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570098/
转载文章受原作者版权保护。转载请注明原作者出处!