5.ElasticSearch数据写入与删除

1.数据写入路由机制

shard=hash(routing)%number_of_primary_shards;

.ElasticSearch数据写入与删除"

一个索引有多个分片组成,多个分片数据组成了所有数据。当数据写入时,路由选择写入到那个分片,优先写入到主分片,然后再写入到副本分片。路由计算默认是基于数据id,也可以自己指定。

数据先写入缓存buffer里面,同时还要写一个事务日志,做持久化,高可用,防止节点突然出现故障,造成数据丢失。当达到一定阈值时,将缓存buffer中的数据写入到文件系统segment中。

2.数据写入

可以使用PUT/POST,数据不存在则插入,存在则更新。也可以使用 _create /_update, _create数据存在则报错,__update数据不存在则会报错。

PUT user_info_001
{
    \"settings\": {
      \"number_of_shards\": 3,
      \"number_of_replicas\": 1
    },
    \"mappings\": {
      \"properties\": {
        \"userId\": {
          \"type\": \"integer\"
        },
        \"name\": {
          \"type\": \"keyword\"
        },
        \"age\":{
          \"type\": \"integer\"
        }
      }
    }
}
#PUT写入
PUT user_info_001/_doc/1
{
  \"userId\":1001,
  \"name\":\"william\",
  \"age\":22
}
#POST写入
POST user_info_001/_doc/1
{
  \"userId\":1001,
  \"name\":\"william\",
  \"age\":22
}
#更新
PUT user_info_001/_create/1
{
  \"userId\":1001,
  \"name\":\"william\",
  \"age\":22
}

2.1常用请求参数

routing: 指定路由

refresh: 是否立即刷新 ,取值true/false,对于实时性要求比较高可以设置为true

wait_for_active_shards: 写入数据等待多少分片响应

version: 并发版本号

op_type: 操作类型,是create还是update

2.2响应参数

_id : 数据唯一 id

result : created/updated

version: 数据版本号

seq_no:索引更新顺序号,每对索引进行更新操作,则进行自增。如果更新值与原数据值一样则不进行自增。

primary_term:主分片版本号

{
  \"_index\" : \"user_info_001\",
  \"_type\" : \"_doc\",
  \"_id\" : \"3\",
  \"_version\" : 1,
  \"result\" : \"created\",
  \"_shards\" : {
    \"total\" : 2,
    \"successful\" : 2,
    \"failed\" : 0
  },
  \"_seq_no\" : 5,
  \"_primary_term\" : 1
}

2.3 批量写入

单条写入性能差,批量效率更高,可以使用bulk关键字,进行批量写入。批量写入无事务保证,可能会局部成功,局部失败。重试机制由客户端保障。注意书写格式。

POST _bulk
{\"index\":{\"_index\":\"user_info_001\"},\"_id\":\"5\"}
{ \"userId\":1005,\"name\":\"bryant\",\"age\":22}
{\"index\":{\"_index\":\"user_info_001\"},\"_id\":\"5\"}
{ \"userId\":1005,\"name\":\"paul\",\"age\":22}

查询总条数使用参数:track_total_hits

GET user_info_001/_search?track_total_hits=true

3.数据删除

3.1 单条删除

DELETE user_info_001/_doc/1

3.2批量删除

POST _bulk
{\"delete\":{\"_index\":\"user_info_001\",\"_id\":\"1\"}}
{\"delete\":{\"_index\":\"user_info_001\",\"_id\":\"2\"}}

3.3条件删除

_delete_by_query:条件删除关键字

requests_per_second 控制每秒删除的数据条数,默认是-1,无限制,当数据量很大,需要删除的数据很多,es使用单线程需要删除很长时间,不建议这样做。设置每秒500~1000左右比较合适。

POST user_info_001/_delete_by_query?conflicts=proceed&requests_per_second=10&scroll_size=10&slices=3
{
  \"query\":{
    \"term\":{
      \"name.keywor\":{
        \"value\":\"paul\"
      }
    }
  }
}

删除响应:

{
  \"took\" : 14,
  \"timed_out\" : false,
  \"total\" : 0,
  \"deleted\" : 0,
  \"batches\" : 0,
  \"version_conflicts\" : 0,
  \"noops\" : 0,
  \"retries\" : {
    \"bulk\" : 0,
    \"search\" : 0
  },
  \"throttled_millis\" : 0,
  \"requests_per_second\" : 10.0,
  \"throttled_until_millis\" : 0,

}  
  

slice:切片,指定切片id和删除操作批次进行删除

POST user_info_001/_delete_by_query
{
  \"slice\":{
    \"id\":1,
    \"max\":2
  },
  \"query\":{
    \"match_all\":{}
  }
}

可以使用 slices,它可以自动进行删除。指定一个数值N,es它会创建N个线程进行删除,N的最大值为分片数。

POST user_info_001/_delete_by_query?slices=2
{
  \"query\":{
    \"match_all\":{}
  }
}

上面的语句会一次查询很多数据,可以使用scroll_size来指定每次查询的条数。它是采用快照查询,设置快照查询大小,控制每次查询数据量。

POST user_info_001/_delete_by_query?slices=2&scroll_size=100
{
  \"query\":{
    \"match_all\":{}
  }
}

4.查看任务

es大量删除数据,是通过异步任务进行删除,可以通过接口查看正在执行的任务。

GET _cat/tasks

GET _tasks?detailed=true&actions=*/delete/byquery

PS:如果遇到有关于百科类创建编辑修改的任何问题,欢迎留言咨询,百科参考网无偿免费回答。请注明出处:https://www.2333.org.cn/2333/12559.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注