作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
Index API
索引API是用于管理单个索引、索引设置、别名、映射和索引模 板等功能的接口。
1、创建索引
创 建 索 引 API 用 于 在 Elasticsearch 中 手 动 创 建 索 引 。 Elasticsearch中的所有文档都存储在某一个索引中。
//语法
PUT /<index>
最基本的形式如下:
PUT twitter
它创建了名为twitter的索引,搜索设置都采用默认值。索引名称 有一些限制,原则是尽可能采用全小写的英文。限制如下:
- 仅小写字母
- 不能包括
\、/、*、?、"、<、>、|、``(空格字符)、,、 #
等 - 7.0版之前的索引可能包含冒号(
:
),但已弃用,7.0版中 不支持它 - 不能以
-、_、+
开头 - 不能是
.或..
- 不能长于255字节(请注意,它是字节数,因此多字节字符 将更快计数到255限制)
1.1、索引设置
创建的每个索引都可以具有与之关联的特定设置,这些设置在正 文中定义,示例如下:
PUT twitter
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
1.2、映射
映射(mapping)的功能是完成字段的定义,包括数据类型、存 储属性、分析器等。示例如下:
PUT twitter
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
},
"mappings": {
"properties": {
"field1": {
"type": "text"
}
}
}
}
2、获取索引
获取一个或多个索引信息:
//语法
GET /<index>
示例:
//获取单个索引
GET /twitter
//获取多个索引
GET /twitter,twitter2
//匹配
GET /twitter*
//获取所有索引
GET /_all
返回:
{
"bank" : {
"aliases" : { },
"mappings" : {
"properties" : {
"account_number" : {
"type" : "long"
},
"address" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"age" : {
"type" : "long"
},
"balance" : {
"type" : "long"
},
"city" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"email" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"employer" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"firstname" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"gender" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"lastname" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"state" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "bank",
"creation_date" : "1697003938876",
"number_of_replicas" : "1",
"uuid" : "1Ny9g32eTSutDG8gfLzQZg",
"version" : {
"created" : "7160099"
}
}
}
}
}
3、更新索引
//语法
PUT /<index>/_settings
示例:
PUT /twitter/_settings
{
"index" : {
"number_of_replicas" : 2
}
}
4、删除索引
删除索引非常简单,但同时也会把索引数据一起删除,不可恢 复。
//语法
DELETE /<index>
示例:
//删除单个索引
DELETE /twitter
//删除多个索引
DELETE /twitter,twitter2
//匹配
DELETE /twitter*
//删除所有索引
DELETE /_all
5、判断索引是否存在
顾名思义,就是判断一个索引是否已存在。
//语法
HEAD /<index>
示例:
HEAD test
返回:
200 - OK
6、索引别名
别名就是索引另外的名称,可以用来实现跨索引查询、无缝切换 等功能。每个索引可以有若干的别名,不同的索引也可以使用相同的别名。
6.1、创建索引别名
//语法
PUT /<index>/_alias/<alias>
POST /<index>/_alias/<alias>
PUT /<index>/_aliases/<alias>
POST /<index>/_aliases/<alias>
查询参数:
master_timeout
: (可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。timeout
: (可选,时间单位) 等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。
Request Body :
filter
:(Required, query object) . 筛选查询(Filter query) 用来限制索引别名, 使用该别名时只返回符合过滤条件的文档。(这个应该是有body的时候才是必填的, 没有body就不用填写了)routing
: (Optional, string) 用于将操作路由到特定分片的自定义路由。
6.1.1、基于时间(time-based)的别名
比如给索引logs_20302801创建一个别名2030:
PUT /logs_20302801/_alias/2030
6.1.2、基于用户(user-based)的别名
创建索引users, 它有一个字段user_id, 然后给个别名user_12, 限制user_id=12的文档:
PUT /users
{
"mappings": {
"properties": {
"user_id":{"type": "integer"}
}
}
}
# 插入几个文档
POST /users/_doc/10
{
"user_id": 10
}
POST /users/_doc/11
{
"user_id": 11
}
POST /users/_doc/12
{
"user_id": 12
}
# 查询, 能看到所有的文档
GET /users/_search
# 给个别名`user_12`, 限制user_id=12的文档:
PUT /users/_alias/user_12
{
"routing": "12",
"filter":{
"term":{
"user_id": 12
}
}
}
# 查询别名, 只能看到 user_id=12的文档
GET /user_12/_search
6.1.3、创建索引时添加别名
建立索引 logs_20302801, 同时添加别名 2030、current_day
PUT /logs_20302801
{
"mappings" : {
"properties" : {
"year" : {"type" : "integer"}
}
},
"aliases" : {
"current_day" : {},
"2030" : {
"filter" : {
"term" : {"year" : 2030 }
}
}
}
}
6.2、删除索引别名
//语法
DELETE /<index>/_alias/<alias>
DELETE /<index>/_aliases/<alias>
路径参数:
<index>
:
支持多个索引以英文逗号分割, 支持通配符表达式。要匹配所有索引,可以使用 _all 或者 *。
//删除多个索引的别名
DELETE /twitter,users,orders/_alias/<alias>
//删除所有索引的别名 ---这个比较危险, 请勿随意测试
DELETE /_all/_alias/<alias>
DELETE /*/_alias/<alias>
<alias>
:
支持多个索引以英文逗号分割, 支持通配符表达式。要匹配所有索引别名,可以使用 _all 或者 *。
//删除指定索引的多个别名
DELETE /<index>/_alias/alias1,alias2,alias3
//按通配符删除指定索引的别名
DELETE /<index>/_alias/ab*
//删除指定索引的所有别名
DELETE /<index>/_alias/*
查询参数:
master_timeout
: (可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。timeout
: (可选,时间单位) 等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。
示例:删除twitter索引的alias1别名
DELETE /twitter/_alias/alias1
6.3、获取索引别名
//语法
GET /_alias
GET /_alias/<alias>
GET /<index>/_alias/<alias>
路径参数:
<index>
:支持多个索引以英文逗号分割, 支持通配符表达式。要匹配所有索引别名,可以使用 _all 或者 *。<index>
:支持多个索引以英文逗号分割,支持通配符表达式。
查询参数:
allow_no_indices
:默认true。如果设置为true, 则当全部使用通配符*、_all只检索不存在(missing)或者已关闭(closed)的索引时,不会抛出错误。
这个是和参数 expand_wildcards 一起使用时的描述。如果只用通配符去检索expand_wildcards=all的别名, 则无论如何不会抛出错误。但是这里的missing条件怎么理解呢 ??
//只是通配符检索别名: 不存在user2开头的别名, 不会报错(返回状态200, 空json)
GET /_alias/user2*?allow_no_indices=false
//检索不存在的user2, 以及user2开头的别名时, 一定会报错(404 + 错误信息json)
GET /_alias/user2?allow_no_indices=true
GET /_alias/user2,user2*?allow_no_indices=true
//会报错 - 这个才是符合描述的(条件 expand_wildcards=closed)
GET /_alias/user2*?allow_no_indices=false&expand_wildcards=closed
-
expand_wildcards
:通配符查询时的范围限制. 支持多个条件的逗号分割.all
:默认, 匹配open和closed的索引, 包括隐藏的.open
:表示只查询开放中的索引closed
:只匹配closed的hidden
:隐藏的(hidden)索引, 必须和open/closed联合使用.none
:不接受通配符.
-
ignore_unavailable
: (可选, bool) 如果有索引不存在时是否忽略。默认false,就是返回404并抛出错误信息。查询时只要有一个索引不存在,则都抛出错误。 -
local
:是否仅从本地节点获取信息,默认false, 表示从master节点获取信息。如果设置为true, 则表示只从本地节点获取.
6.3.1、获取当前集群下的所有别名
返回所有索引, 无别名的显示空json:
GET /_alias
GET /_all/_alias
GET /*/_alias
6.3.2、获取所有索引中有指定别名的
多个别名以英文逗号分割。
只要有一个别名不存在时抛出错误, 返回404状态, 以及能匹配到的部分索引
比如: 存在别名 user_12 和 2030, 不存在别名user_13
GET /_alias/user_13
返回:
{
"error" : "alias [user_13] missing",
"status" : 404
}