Elasticsearch从入门到精通-03基本语法学习

Elasticsearch从入门到精通-03基本语法学习

👏作者简介:大家好,我是程序员行走的鱼

📖 本篇主要介绍和大家一块学习一下ES基本语法,主要包括索引管理、文档管理、映射管理等内容

1.1 了解Restful

ES对数据进行增、删、改、查是以Restful方式对服务端发送请求的,所以在我们学习基本语法之前先了解一下Restful是什么?

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。

在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和DELETE。

REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括 HTTP GET、POST、PUT、DELETE,还可能包括 HEAD 和 OPTIONS。简单的理解就是,如果想要访问互联网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径,以及对资源进行的操作(增删改查)。

1.2 Elasticsearch的数据格式

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

image-20221129225355547

ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个type,Elasticsearch 7.X 中, Type 的概念已经被删除了。

1.3 索引操作

1)创建索引

语法:put /索引名

示例:

image-20240308145221525

{

“acknowledged”【响应结果】: true, # true 操作成功

“shards_acknowledged”【分片结果】: true, # 分片操作成功

“index”【索引名称】: “shopping”

}

注意:创建索引库的分片数(7.0.0之后)默认1片,在 7.0.0 之前的 Elasticsearch 版本中,默认 5 片

当然ES是不允许我们重复创建索引的,如果重复创建索引出报以下错误:

image-20240308150205108

2)查询索引

语法:GET /索引名

示例:

image-20240308151855688

{
	"es_db": {  //索引名
		"aliases": {}, //别名
		"mappings": {},//映射
		"settings": {//设置
			"index": { //【设置 - 索引
				"creation_date": "1669733081007",//设置 - 索引 - 创建时间
				"number_of_shards": "1",//设置 - 索引 - 主分片数量
				"number_of_replicas": "1",//设置 - 索引 - 副分片数量
				"uuid": "qhr5DAFeSrOGex2vElBwag", //设置 - 索引 - 唯一标识
				"version": { //设置 - 索引 - 版本
					"created": "7080099"
				},
				"provided_name": "shopping" //设置 - 索引 - 名称
			}
		}
	}
}

3)查询所有索引

语法:GET /_cat/indices?v

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

示例:

image-20240308152420990

字段说明:

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

4)删除索引

语法:DELETE /索引名称

示例:

image-20240308152939159

1.4 文档操作

1)创建文档

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

PUT /es_db/_doc/1
{
  "name": "张三",
  "sex": 1,
  "age": 25,
  "address": "广州天河公园",
  "remark": "java developer"
}

PUT /es_db/_doc/2
{
  "name": "李四",
  "sex": 1,
  "age": 28,
  "address": "广州荔湾大厦",
  "remark": "java assistant"
}

PUT /es_db/_doc/3
{
  "name": "rod",
  "sex": 0,
  "age": 26,
  "address": "广州白云山公园",
  "remark": "php developer"
}

PUT /es_db/_doc/4
{
  "name": "admin",
  "sex": 0,
  "age": 22,
  "address": "长沙橘子洲头",
  "remark": "python assistant"
}

PUT /es_db/_doc/5
{
  "name": "小明",
  "sex": 0,
  "age": 19,
  "address": "长沙岳麓山",
  "remark": "java architect assistant"
}		

结果:

image-20240308153525298

  "_index" : "es_db",//索引
  "_type" : "_doc",//类型-文档
  "_id" : "1",//唯一标识 可以类比为 MySQL 中的主键,不指定随机生成
  "_version" : 1,//版本
  "result" : "created",//这里的 create 表示创建成功
  "_shards" : {//分片
    "total" : 2, //分片 - 总数
    "successful" : 1,//分片 - 成功
    "failed" : 0//分片 - 失败
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

使用put名称添加数据的时候必须指定id,使用post可以不需要添加id,系统会默认随机生成一个id

2)查看文档

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

语法: PUT /索引名称/类型/id

示例:

image-20240308154115964

{
  "_index" : "es_db", //索引
  "_type" : "_doc",//文档类型
  "_id" : "1",//文档id
  "_version" : 1,//文档版本
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,//查询结果  true 表示查找到,false 表示未查找到
  "_source" : {//文档源信息
    "name" : "张三",
    "sex" : 1,
    "age" : 25,
    "address" : "广州天河公园",
    "remark" : "java developer"
  }
}

3)修改文档

和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖。

POST /es_db/_doc/1
{
  "name": "张三_修改",
  "sex": 1,
  "age": 25,
  "address": "广州天河公园",
  "remark": "java developer"
}

示例:

image-20240308155057390

4)删除文档

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

语法: DELETE /索引名称/类型/id

示例:

image-20240308155624619

5)批量获取文档

方式1:

GET _mget
{
  "docs": [
    {
      "_index": "es_db",
      "_type": "_doc",
      "_id": 1
    },
    {
      "_index": "es_db",
      "_type": "_doc",
      "_id": 2
    }
  ]
}

示例:

image-20240308161856611

方式2:

GET /es_db/_mget
{
  "docs": [
    {
      "_type": "_doc",
      "_id": 3
    },
    {
      "_type": "_doc",
      "_id": 4
    }
  ]
}

示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方法3:

GET /es_db/_doc/_mget
{
  "docs": [
    {
      "_id": 1
    },
    {
      "_id": 2
    }
  ]
}

image-20240308162745799

6)批量操作文档

格式:

批量对文档进行写操作是通过_bulk的API来实现的

  • 请求方式:POST
  • 请求地址:_bulk
  • 请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)
    • 第一行参数为指定操作的类型和操作的对象
    • 第二行参数才是操作的数据
{"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}
{"field1":"value1", "field2":"value2"}
  • actionName:表示操作类型,主要有create,index,delete和update

批量创建文档:

POST _bulk
{"create":{"_index":"es_db","_type":"_doc","_id":6}}
{"id":6,"name" : "李四","sex" : 1,"age" : 28,"address" : "广州荔湾大厦", "remark" : "java assistant"}
{"create":{"_index":"es_db","_type":"_doc","_id":7}}
{"id":6,"name" : "李四","sex" : 1,"age" : 28,"address" : "广州荔湾大厦", "remark" : "java assistant"}

普通创建或者全量替换INDEX

  • 如果原文档不存在,则是创建
  • 如果原文档存在,则是替换(全量修改原文档)
POST _bulk
{"index":{"_index":"es_db","_type":"_doc","_id":6}}
{"id":6,"name":"李四_修改"}
{"index":{"_index":"es_db","_type":"_doc","_id":8}}
{"id":8,"name":"李四","sex":1,"age":28,"address":"广州荔湾大厦","remark":"java assistant"}

批量删除:

POST _bulk
{"delete":{"_index":"es_db", "_type":"_doc", "_id":6}}
{"delete":{"_index":"es_db", "_type":"_doc", "_id":7}}

批量修改:

POST _bulk
{"update":{"_index":"es_db", "_type":"_doc", "_id":3}}
{"doc":{"name":"李四_修改"}}
{"update":{"_index":"es_db", "_type":"_doc", "_id":4}}
{"doc":{"name":"李四_修改"}}

1.5 索引映射

有了索引库,等于有了数据库中的 database。接下来就需要建索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。ES中映射可以分为动态映射和静态映射

动态映射:

在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射(即关系型数据库的表、字段等),在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。

动态映射规则如下:

image-20221204222154542

静态映射:

静态映射是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射。

1)创建映射

创建student索引

PUT /student

创建student索引映射

语法:

PUT /student/_mapping
{
    "properties":{
        "name":{
            "type":"text",
            "index":true

        },
        "sex":{
            "type":"text",
            "index":false

        },
        "age":{
            "type":"long",
            "index":false

        }
    }
}

映射数据说明:

  • 字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price

  • type:类型,Elasticsearch 中支持的数据类型非常丰富,说几个关键的:

    • String 类型,又分两种:
      • text:可分词
      • keyword:不可分词,数据会作为完整字段进行匹配
    • Numerical:数值类型,分两类
      • 基本数据类型:long、integer、short、byte、double、float、half_float
      • 浮点数的高精度类型:scaled_float
    • Date:日期类型
    • Array:数组类型
    • Object:对象
  • index:是否索引,默认为 true,也就是说你不进行任何配置,所有字段都会被索引。

    • true:字段会被索引,则可以用来进行搜索
    • false:字段不会被索引,不能用来搜索
  • store:是否将数据进行独立存储,默认为 false

原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。

2)修改映射

一个索引库如果创建好了索引映射,是无法直接进行修改的,会提示一下错误:

image-20240308173756464

那么我们如何做一个不修改代码、不停机的前提下去做一个索引映射的调整呢?那我们接着往下看

上边我们已经为student创建过映射,现在查看下库里的数据

image-20240308225811391

这时候我们需要把name改为keyword类型,先创建一个新的索引student1

PUT /student1
{
    "settings":{},
    "mappings":{
			"properties": {
				"age": {
					"type": "long",
					"index": false
				},
				"name": {
					"type": "keyword",
					"index": false
				},
				"sex": {
					"type": "text",
					"index": false
				}
			}
        }
    
}

image-20240308230036086

开始数据迁移:

POST _reindex
{
  "source": {
    "index": "student"
  },
  "dest": {
    "index": "student1"
  }
}

删除老索引:

DELETE /student

给新索引起别名

PUT /student1/_alias/student

再看下新索引映射:

image-20240308230530726

再看下新索引数据:

image-20240308230554174

				"index": false
			},
			"sex": {
				"type": "text",
				"index": false
			}
		}
    }

}


[外链图片转存中...(img-H1Q2H8Kq-1709993484097)]

开始数据迁移:

```json
POST _reindex
{
  "source": {
    "index": "student"
  },
  "dest": {
    "index": "student1"
  }
}

删除老索引:

DELETE /student

给新索引起别名

PUT /student1/_alias/student

再看下新索引映射:

[外链图片转存中…(img-taiTtOom-1709993484097)]

再看下新索引数据:

[外链图片转存中…(img-K1oj3rAC-1709993484098)]

🌟至此本篇就结束了,下一篇将介绍ES高级语法DSL!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/444040.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程-线程池原子性并发工具类

1.线程池 1.线程状态 虚拟机中线程的六种状态 新建状态(NEW) --创建线程 就绪状态(RUNNABLE) --start方法 阻塞状态(BLOCKED) --无法获得锁对象 等待状态(WAITING) …

MySQL学习Day28——锁

一、概述: 锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等)需要保证这个数据在任何时刻最多只有一个线程在访问,保…

蓝桥杯简单题,公司名称

题目链接&#xff08;需要登录&#xff09; #include <iostream> #include <cstring> #include <algorithm> using namespace std; bool lanqiao(string str,int len){ sort(str.begin(),str.end());//对str按照ascii排序if(str.find("Laainoq")s…

HTML静态网页成品作业(HTML+CSS)——安徽宣笔设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有6个页面。 &#x1f3f7;️想要…

Linux系统——web服务拓展练习

目录 一、实验环境搭建 1. Centos 7-5——Client 2. Centos 7-1——网关服务器 3. Centos 7-2——Web1 4. Centos 7-3——Web2 5. Centos 7-4——Nginx 二、在Nginx服务器上搭建LNMP服务&#xff0c;并且能够对外提供Discuz论坛服务&#xff1b;在Web1、Web2服务器上搭建…

springboot255基于spring boot的疫情信息管理系统

疫情信息管理系统的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定疫情信息管理系统…

Unity Shader实现UI流光效果

效果&#xff1a; shader Shader "UI/Unlit/Flowlight" {Properties{[PerRendererData] _MainTex("Sprite Texture", 2D) "white" {}_Color("Tint", Color) (1, 1, 1, 1)[MaterialToggle] PixelSnap("Pixel snap", float…

【数据分享】2000-2022年全国1km分辨率的逐日PM10栅格数据

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2022年全国范围逐日的PM2.5栅格数据和2013-2022年全国范围逐日SO2栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;。 本次我们给大家带来的是2000-2022年全国范围的逐日的PM10栅…

吴恩达deeplearning.ai:倾斜数据集的误差指标精确率、召回率

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 倾斜数据集的误差指标罕见病预测精确率和召回率 精确率和召回率的权衡精确率和召回率的矛盾关系 F1算法 倾斜数据集的误差指标 在神经网络中&#xff0c;如果你的数据集中正例和负…

giffgaff怎么充值?giffgaff怎么续费?

-性价比高&#xff1a;0月租&#xff0c;免费接收短信&#xff0c;充值一次&#xff0c;接码可以用20年以上&#xff08;仅需半年保号一次&#xff09;&#xff0c;可能是国内性价比最高的接码实体卡&#xff01;-安全&#xff1a;实体卡无须担心因号码被风控&#xff0c;还可以…

C语言:通讯录

目录 前言 1、通讯录框架&#xff0c;基本介绍 2、程序实现&#xff0c;步骤解释 2.1. 建立菜单 2.2. 主函数框架 2.3 前期工作 2.4 初始化通讯录函数&#xff1a;void InitContact(Contact* pc); 2.5 添加信息操作&#xff1a;void AddContact(Contact* pc); 2.6 显示…

Sublime Text 格式化Json文件 之 Pretty Json

需要使用到 Pretty Json插件。 一、安装方法 sublime 下&#xff0c;按快捷键 Comand control p&#xff0c; 输入install Package,然后回车 等几秒钟&#xff0c;加载启动进程完毕后弹出的页面中输入pretty json, 然后回车 等待几秒钟&#xff0c;可以查看Sublime 最下面的…

nginx配置支持ipv6访问,ipv4改造ipv6

一、前言 本地测试nginx部署的web系统支持ipv6地址访问。 二、本机ipv6地址 cmd ipconfig 找到IPv6地址 其中带有%号其实是临时分配得到地址 我们可以ping一下看看 另一种ping的方式 加上中括号 还有就是去掉%号 三、nginx增加配置 server块里增加 listen [::]:80; 四、测…

【SQL】指定日期的产品价格(IFNULL函数)

题目描述 leetcode题目&#xff1a;指定日期的产品价格 思路 找出所有的产品的指定的日期的价格&#xff1b;若找不到某个产品的更改日期&#xff0c;则将该产品价格设置为10。 关键点&#xff1a; if没有16号的&#xff0c;怎么找到前一个日期的&#xff1f;> 日期小…

【数字人】12、DINet | 使用形变+修复模块实现高清 talking head 生成(AAAI2023)

文章目录 一、背景二、方法2.1 deformation part2.2 inpainting part2.3 Loss 函数 三、效果3.1 数据集3.2 实现细节3.3 可视化效果 论文&#xff1a;DINet: Deformation Inpainting Network for Realistic Face Visually Dubbing on High Resolution Video 代码&#xff1a;h…

Yolov8-pose关键点检测:原创自研涨点系列篇 | 空间上下文感知模块(SCAM)结合超轻量高效动态上采样DySample

💡💡💡本文独家改进:YOLOV8-pose head创新,1)一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv8网络中的nn.Upsample;2)加入空间上下文感知模块(SCAM)进一步提升检测精度; 改进结构图如下: Yolov8-Pose关键点检测专栏介绍:ht…

回溯算法09-子集II(Java/子集问题的去重方法)

9.子集II 题目描述 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列。 示例 1&#xff1a; 输入&#xf…

VMware虚拟机安装Ubuntu kylin22.04系统教程(附截图详细步骤)

一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro 虚拟机版本&#xff1a;17.0.0 build-20800274 ISO映像文件&#xff1a;ubuntukylin-22.04-pro-amd64.iso 二、安装步骤 打开虚拟机&#xff0c;点击创建新的虚拟机&#xff1a; 选择自定义&#xff1a; 硬…

2024年新手视频剪辑软件推荐-6款视频剪辑软件测评

视频剪辑软件推荐 premiere premiere 直达地址:各大软件网站 说到底,还是得专业的来,虽然很多人觉得他是收费的,但是你懂的,想要免费总是会有办法的.别的不说,剪辑这块,我还是很认可这个软件,虽然我现在还是刚入门. 剪映 剪映 抖音官方推出的一款手机视频编辑剪辑应用,提供切割…

Full GC的认识、预防和定位

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有限&am…