程序员小强总结的 ElasticSearch专题超全总结篇在这里:传送门 结合官网资料,做了更详细的实际使用总结。
从单机版安装到集群高可用生产环境搭建、基本概念(索引,分片,节点,倒排索引…)、DSL语法实践、分词器(内置+中文)、SpringBoot整合实战、仿京东商品搜索实战实现。
1.新增文档
语法:公式
POST /索引库名/_doc(/手动添加的id)
{
"key":"value"
}
这里是有 post或者put都可以
区别在于
- put文档必须要指定文档_id;post可指定,可不指定,不指定则会随机生成一个_id
关于映射Mapping
- 若没有提前设定索引中字段类型而直接添加文档,es会对字段数据给自动数据类型,新字段会永久补充到mapping。
- 若添加的数据字段数量大于提前设定索引中字段数量,可成功,按情况1处理。
- 若添加的数据字段数量小于提前设定索引中字段数量,可成功。
1.1指定文档ID
指定文档ID插入:手动指定ID
示例1: POST指定ID
POST /my_index1/_doc/1001
{
"name":"李四",
"age":23,
"phone":"13233333332"
}
示例2: PUT指定ID(注:put必须指定ID)
PUT /my_index1/_doc/1002
{
"name":"王五",
"age":23,
"phone":"13233333333"
}
1.2自动产生文档ID
自动产生文档ID插入:不是MySQL那样的AutoIncrement,而是类似MongoDB那样的自动生成ID
POST /my_index1/_doc/
{
"name":"张三",
"age":22,
"phone":"13233333331"
}
2.查询文档
查询某索引下的文档
2.1查询所有文档
GET /my_index1/_search
2.2根据ID查询指定文档
GET /index_name/_doc/1
3.修改文档
3.1更新全部
注:全修改,请求方式PUT和POST都可以,全部字段均会被修改更新,可以新增字段,当ID未匹配上时,执行新增。
POST /my_index1/_doc/1002
{
"name":"王五",
"age":23,
"phone":"13233333333",
"desc":"我是新增的描述"
}
3.2部分更新
注:部分修改,请求方式 POST,只修改部分字段数据,当ID未匹配上时,执行新增。
- 需要doc包裹
- 不支持-不存在则创建
- 不支持PUT请求方式
POST /my_index1/_update/10021/
{
"doc": {
"name": "王五",
"age": 23,
"phone": "13233333333",
"desc": "我是新增的描述3"
}
}
3.3并发更新
Es使用版本version来管理文档,在更新的时候可以加上版本来控制并发。
参数说明
-
_seq_no,
严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no
大于先写入的Doc的_seq_no。 -
primary_term
和_seq_no
一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1
#先查询一下
GET /my_index1/_doc/1001
#带着查询中返回的 seq_no 和primary_term 参数更新
POST /my_index1/_doc/1001?if_seq_no=11&if_primary_term=1
{
"doc":{
"amount":333
}
}
4.删除文档
根据id删除指定文档
DELETE /my_index1/_doc/10021
5.批量操作
批量操作是指,一批命令同时执行(减少IO),这些命令不一定是同种类型。
5.1批量查找
5.1.1多ID查询
GET /my_index3/_search
{
"query": {
"ids": {
"values":[ 1001, 1002, 1003 ]
}
}
}
5.1.2mget单索引
# 批量查询my_index3索引数据
POST /my_index3/_mget
{
"ids": [
"1001",
"1002",
"1003"
]
}
5.1.3mget跨索引
# 同时查询my_index1与my_index3两个所以下的数据
GET /_mget
{
"docs": [
{
"_index": "my_index1",
"_id": "1001"
},
{
"_index": "my_index3",
"_id": "1002"
}
]
}
5.2批量新增
POST _bulk
{ "create" : { "_index" : "my_index3", "_id" : "1001" } }
{"name":"张三","age":20,"phone":"13233333331","desc":"我是张三的描述"}
{ "create" : { "_index" : "my_index3", "_id" : "1002" } }
{"name":"李四","age":21,"phone":"13233333332","desc":"我是李四的描述"}
注:
- 命令是只有文档不存在-才会插入。
- index 会判断若存在就更新,不存在就新增;
5.3批量更新
POST _bulk
{"update":{"_index":"my_index3","_id":"1001"}}
{"doc":{"age":20,"desc":"我是张三修改的描述"}}
{"update":{"_index":"my_index3","_id":"1002"}}
{"doc":{"age":20,"desc":"我是李四修改的描述"}}
注:
- 命令下一行需要紧跟着data数据
5.4批量增删改同时操作
使用_bulk命令可以进行文档的批量增删改
POST _bulk
{ "create" : { "_index" : "my_index3", "_id" : "1003" } }
{"name":"王五","age":21,"phone":"13233333333","desc":"我是王五的描述"}
{ "update" : { "_index" : "my_index3", "_id" : "1001" } }
{ "doc" : {"age" : 19,"desc":"我是张三第二次修改的描述"} }
{ "delete" : { "_index" : "my_index3", "_id" : "1002" } }
以上命令
- 新增ID为1003的文档
- 更新ID为1001的文档
- 删除ID为1002的文档
5.5批量删除
POST _bulk
{ "delete" : { "_index" : "my_index3", "_id" : "1001" } }
{ "delete" : { "_index" : "my_index3", "_id" : "1003" } }