当前位置: 代码迷 >> 综合 >> Elasticsearch7.x DSL语法之文档管理
  详细解决方案

Elasticsearch7.x DSL语法之文档管理

热度:9   发布时间:2023-12-03 19:31:11.0

程序员小强总结的 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" } }

关注程序员小强公众号更多编程趣事,知识心得与您分享
?关注“程序员小强”发送关键字“elasticSearch”到公众号获取相关篇