索引操作 index
创建索引
put 方法创建索引
使用 put 创建索引时必须指明文档id,否则报错
# PUT 创建命令
# test1 索引名称
# type1 类型名称,默认为_doc,已经被废弃
# 1 文档id
PUT /test1/type1/1
{"name":"zhangsan","age":18,"birth":"2000-01-20"
}
结果:
#! Deprecation: [types removal] Specifying types in document index requests is deprecated, use the typeless endpoints instead (/{index}/_doc/{id}, /{index}/_doc, or /{index}/_create/{id}).
{"_index" : "test1", // 索引"_type" : "type1", // 类型"_id" : "1", // id"_version" : 1, // 版本"result" : "created", // 操作类型"_shards" : { // 分片信息"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1
}
post 方法创建索引
post 如果没有指明文档id,会随机生成一个
POST /test2/type2
{"name":"zhangsan","age":18,"birth":"2000-01-20"
}
结果:
#! Deprecation: [types removal] Specifying types in document index requests is deprecated, use the typeless endpoints instead (/{index}/_doc/{id}, /{index}/_doc, or /{index}/_create/{id}).
{"_index" : "test2","_type" : "type2","_id" : "3D_WQY4BOf0ywiICmI8O","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1
}
对比 mysql :
PUT test1/type1/1 : 索引test1相当于关系型数据库的库,类型type1就相当于表 ,1 代表数据中的主键 id
这里需要补充的是 ,在 es5 版本前,一个索引下可以创建多个类型,但是在之后,一个索引只能对应一个类型,默认为 _doc,而 id 相当于关系型数据库的主键id若果不指定就会默认生成一个20位的uuid,属性相当关系型数据库的column(列)。
而结果中的 result 则是操作类型,现在是 created ,表示第一次创建。如果再次点击执行该命令那么 result 则会是 updated ,我们细心则会发现 _version 开始是1,现在你每点击一次就会增加一次。表示第几次更改。
查看索引信息
# get 索引名称
GET test1
{"test1" : {"aliases" : { },"mappings" : {"properties" : {"age" : {"type" : "long"},"birth" : {"type" : "date"},"name" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}},"settings" : {"index" : {"creation_date" : "1710501416895","number_of_shards" : "1","number_of_replicas" : "1","uuid" : "hemDp4F3T5ePsAZmaO5Ijg","version" : {"created" : "7080099"},"provided_name" : "test1"}}}
}
可以看到 name、age、birth 字段指定了类型 text、long、date ,说明 es 会根据字段的值指定默认的类型
指定字段类型
如果想要自己指定字段的类型,使用映射
PUT /test3
{"mappings": {"properties": {"name":{"type": "text"},"age":{"type": "long"},"birth":{"type": "date"}}}
}
结果:
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "test3"
}
映射数据是字段名:json 数据,上面只指定了type
(数据类型),其实可以指定很多属性
- type:数据类型,es 中支持的数据类型非常丰富,主要使用以下几个:
- string 类型,又分两种:
- text:可分词
- keyword:不可分词,数据会作为完整字段进行匹配
- Numerical:数值类型,分两类:
- 基本数据类型:long、integer、short、byte、double、float、half_float
- 浮点数的高精度类型:scaled_float
- Date:日期类型
- Array:数组类型
- Object:对象
- string 类型,又分两种:
- index:是否索引,默认为 true,所有字段都会被索引,被索引则可以用来搜索,没有则不可以
- store:是否将数据进行独立存储,默认为 false,原始的文本会存储在 _source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从 _source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置 “store”: true 即可,获取独立存储的字段要比从 _source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
- analyzer:分词器,这里的 ik_max_word 即使用 ik 分词器
查看索引映射
# get /索引名称/_mapping
GET /test3/_mapping
结果:
{"test3" : {"mappings" : {"properties" : {"age" : {"type" : "long"},"birth" : {"type" : "date"},"name" : {"type" : "text"}}}}
}
查看索引健康情况
GET _cat/indices?v
可以查看我们所有索引的状态健康情况,分片,数据储存大小等等。
删除索引
# delete 索引名称
DELETE test3
结果:
{"acknowledged" : true
}