ES快速简介
ElasticSearch,是一个分布式的分析和搜索引擎,对外提供了一组Restful风格的API用于操作ES数据库。ES是一个非关系型数据库,它采用JSON的格式保存数据,并且可以对JSON中的每一个字段进行索引,从而实现快速搜索功能。它的层级与关系型数据库对应关系如下表所示:
非关系型 | ES数据库 | index索引 | type类型 | doc文档 | Json字段 |
关系型 | SQL数据库 | datavase数据库 | table表 | row数据 | field字段 |
备注 | type类型ES从7.x版本弃用默认_doc |
ES命令
index索引部分
基础命令
# 创建索引
PUT /index_name
# 创建索引idx_123
PUT /idx_123
# 查询索引
GET /index_name
# 查询索引idx_123
GET /idx_123
# 查询所有索引的详细信息
GET /_cat/indices?v
# 查看集群中所有aliases(索引别名)的信息
GET /_cat/aliases?v
# 删除索引
DELETE /index_name
# 删除索引idx_123
DELETE /idx_123
索引别名(alias)命令
ES中允许为索引添加别名,可以通过别名alias来操作ES数据
最重要的一点:通过别名只能够对索引中的数据进行查询操作,不能够进行增删改操作,这增加了数据操作的安全性。
添加别名
# 给索引'idx_123'设置别名'abc'
POST /idx_123/_alias/abc
# 返回结果,"aliases"内容为别名
{
"idx_123": {
"aliases": {
"abc": { }
}
}
}
如果需要通过别名对数据进行增删改操作,设置**【is_write_index=true】**
# 给索引'idx_123'设置别名'abc'
POST /_aliases
{
"actions": [
{
"add": {
"index": "idx_123", # 索引原名
"alias": "abc", # 索引别名
"is_write_index": true # 赋予增删改权限
}
}
]
}
# 返回结果,true代表成功
{
"acknowledged": true
}
查询别名
查询索引
idx_123
的别名
# 查询idx_123的别名
GET /idx_123/_alias
# 返回结果,"aliases"内容为别名"abc"
{
"idx_123": {
"aliases": {
"abc": { }
}
}
}
删除别名
# 删除idx_123的别名abc
DELETE /idx_123/_alias/abc
# or
POST /_aliases
{
"actions": [
{
"remove": {
"index": "idx_123",
"alias": "abc"
}
}
]
}
# 返回结果,true代表成功
{
"acknowledged": true
}
映射(mapping)命令
ES中的mapping,就像sql中定义表的字段属性一样,定义JOSN信息中每个字段的数据类型
类型名 | 对应类型 |
字符串 | text(默认,文本被拆分成词便于查询)、keyword(专有名词,只能精确值查找) |
整型数值 | long(默认)、integer、short、byte |
浮点数值 | double、float、half float、scaled float |
日期 | date |
布尔 | true、false |
二进制 | binary |
其他类型 | 不建议使用 |
创建映射
没有创建索引的映射(mapping)时就添加了doc文档时,ES会根据字段类型动态映射出一套mapping,但有时错误的映射会导致后续的增删改查出现问题,还是建议自己创建
# 为"idx_123"创建映射
PUT /idx_123
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"sex": {
"type": "keyword"
},
"age": {
"type": "integer"
}
}
}
}
查询映射
# 查询"idx_123"的mapping结构
GET /idx_123/_mapping
doc文档部分
7.x版本之前,使用type类型。以下操作的环境都是在7.x版本环境下的命令,默认使用
_doc
的type类型
创建文档
在
idx_123
的索引下_doc
(默认type类型)创建一个id叫做20230324
的文档,存储的信息为{“name”: “zhangsan”, “sex”:“male”, “age”: 18}
# 发送命令
POST /idx_123/_doc/20230324
{
"name": "zhangsan",
"sex": "male",
"age": 18
}
# 返回结果,"created"代表创建成功
{
"result" : "created"
}
查询文档
查询
idx_123
的索引下_doc/20230324
的文档信息
# 通过文档id查询指定文档
GET /idx_123/_doc/20230324
# 返回结果,"_source"内容为文档信息
{
"_source": {
"name": "zhangsan",
"sex": "male",
"age": 18
}
}
更新文档
一定要注意全量更新与增量更新的区别,使用增量更新更加安全!!!
全量更新和创建文档的方式一样,会覆盖JSON文档所有字段,这导致更新未输入但新建时原本存在的字段数据直接消失!!!
增量更新会只更新指定的JSON字段的数据,其他原本存在的字段数据不受影响。
全量更新,更新
idx_123
的索引下_doc/20230324
的文档,更新的信息为{“sex”:“famale”, “age”: 20}
# 更新命令
POST /idx_123/_doc/20230324
{
"sex": "famale",
"age": 20
}
# 返回结果,"updated"代表更新成功
{
"result" : "updated"
}
# 更新结果(name字段数据直接消失不见)
{
"sex": "famale",
"age": 20
}
增量更新,更新
idx_123
的索引下_doc/20230324
的文档,更新的信息为{“sex”:“famale”, “age”: 20}
# 更新命令
POST /idx_123/_doc/20230324/_update
{
"doc": {
"sex": "famale",
"age": 20
}
}
# 返回结果,"updated"代表更新成功
{
"result" : "updated"
}
# 更新结果(name字段数据保留更新前数据)
{
"name": "zhangsan",
"sex": "famale",
"age": 20
}
删除数据
删除
idx_123
的索引下_doc/20230324
的文档
# 删除文档
DELETE /idx_123/_doc/20230324
# 返回结果,"deleted"代表更新成功
{
"result" : "deleted"
}