文档

elasticsearch是通过document的形式存储数据的,个人理解文档就是一条数据一个对象

我们添加索引文档中不仅包含了数据还包含了元数据

比如我们为一个数据添加索引

文档中不仅有json的这些属性还包含红框中的值

文档的CRUD

http://127.0.0.1:9200/blogs/product/1

put 修改或者新增id为1的文档如果不存在新增 如果存在修改(1.找到旧文档json  2.修改他 3.删除旧文档 4.索引新文档)

delete则为删除

elasticsearch乐观锁

可以发现我们文档元数据有个version字段我们可以利用version字段进行乐观锁

修改失败 我们把版本换成4试试

成功

使用外部版本控制,比如使用我们主数据库表的版本字段添加则使用

http://127.0.0.1:9200/blogs/product/1?version=10&version_type=external

可以看到版本号变成了10  如果再次执行会抱错 因为不大于当前版本号 可以控制并发新增 导致的数据重复

文档局部更新

前面我们看到通过update请求也能实现更新,但是他是覆盖文档,删除原来的文档填入新的文档

post请求:http://127.0.0.1:9200/blogs/product/1/_update

参数

{
"doc":{
"productName":"测试修改",
"videw":1
}
}

相同字段会被更新 不存在的则添加到文档

使用groovy脚本更新

价格+1

post请求:http://127.0.0.1:9200/blogs/product/1/_update

参数

{
"script":"ctx._source.price+=1"
}

ctx代表文档_source代表文档中的_source字段,因为我们的数据就是存在文档元数据的_source字段的

{
"_index": "blogs",
"_type": "product",
"_id": "1",
"_version": 12,
"_seq_no": 9,
"_primary_term": 1,
"found": true,
"_source": {
"productName": "测试修改",
"price": 11,
"remark": "不错的床垫",
"tags": [
"家具",
"床垫",
"棉花"
],
"videw": 1
}
}

往tag中添加一个元素

post请求:http://127.0.0.1:9200/blogs/product/1/_update

参数:

{
"script":"ctx._source.tag+=newtag",
"params":{
"newtag":"测试tag新增"
}
}

5.*之后会报错 Variable [newtag] is not defined

参数应改为:

{
"script":"ctx._source.tags.add(params.newtag)",
"params":{
"newtag":"测试tag新增"
}
}

更新不存在的文档

适合计数器

post请求:http://127.0.0.1:9200/blogs/product/2/_update

参数

{
"script":"ctx._source.count+=1",
"upsert":{
"count":"1"
}
}

第一次请求 将会为文档id为2的创建一个count属性 后续请求+1

更新重试

post请求:http://127.0.0.1:9200/blogs/product/2/_update?retry_on_conflict=5 更新失败后将会重试5此

批量操作

格式:

{
actionName:{metadata}\n
{requestBody}\n
.....
}

如我们同时要新增替换文档删除文档局部更新

post请求:http://127.0.0.1:9200/_bulk

{"create":{"_index":"blog","_type":"product","_id":5}}
{"title":{"productName": "批量测试新增5","price": 10,"remark": "不错的床垫","tags": ["家具","床垫","棉花"],"videw": 1}}
{"index":{"_index":"blog","_type":"product","_id":5}}\n
{"title":{"productName": "批量测试新增","price": 10,"remark": "不错的床垫","tags": ["家具","床垫","棉花"],"videw": 1}}
{"update":{"_index":"blog","_type":"product","_id":1,"_retry_on_conflict":3}}
{"doc":{"title":{"productName": "批量测试修改" }}}
{"delete":{"_index":"blog","_type":"product","_id":5}}}}

注意最后一个json需要有一个换行符

create创建文档 不存在则新增

index 创建文档不存在新增 存在覆盖

update 局部更新

delete删除

响应结果:

{
"took": 7,
"errors": true,
"items": [
{
"create": {
"_index": "blog",
"_type": "product",
"_id": "5",
"status": 409,
"error": {
"type": "version_conflict_engine_exception",
"reason": "[product][5]: version conflict, document already exists (current version [2])",
"index_uuid": "CZ6SoctfQcCzXmVXFLdDuA",
"shard": "1",
"index": "blog"
}
}
},
{
"index": {
"_index": "blog",
"_type": "product",
"_id": "5",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1,
"status": 200
}
},
{
"update": {
"_index": "blog",
"_type": "product",
"_id": "1",
"status": 404,
"error": {
"type": "document_missing_exception",
"reason": "[product][1]: document missing",
"index_uuid": "CZ6SoctfQcCzXmVXFLdDuA",
"shard": "3",
"index": "blog"
}
}
},
{
"delete": {
"_index": "blog",
"_type": "product",
"_id": "5",
"_version": 4,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1,
"status": 200
}
}
]
}

不需要重复指定所以呢和type可以在url带上索引和type上面就不用指定索引和type了

批量操作都是独立的并不是原子的 互不影响

索引文档原理

新建索引和删除文档

write操作都必须在主节点完成

1:请求到note1  操作P0分片数据

2.确定根据id shard=hash(routing)%number_of_parimary_shard 求出余数算出分片位置  转发请求到node3

3.node3执行请求 如果成功 复制分片在node1和node2 索引转发请求到node1和node2 如果都成功则修改生效

replication参数

第3步骤转发请求到复制分片是同步的 可以通过设置replication为async 则为异步  但是数据的准确性得不到保证 而且会导致每个请求都不等待复制返回 而导致的请求过载(不建议使用)、

consistency参数

在写入时必须有规定数量的分片可用才能写入 公式:

5.*以上貌似移除

timeout参数

分片副本不足的等待时间 默认一分钟

检索文档

1.node1接收到检索P0分片的请求

2.因为P0分片数据 在3个节点都存在

3.保证性能会通过负载均衡算法 算出转发到对应的节点

局部更新

1.node1接收到修改p0分片数据

2.转发到node3节点

3.node3节点 将分片文档的_source进行替换并重做索引

4.将请求转发大node1和node2处理 因为复制分片存放在node1和node2

根据条件更新

api地址:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/docs-update-by-query.html

post:http://127.0.0.1:9200/[indexName]/_update_by_query

{
"query": {
"bool": {
"must": [{
"term": {
"_id": "11"
}
}]
}
},
"script": {
"inline": "ctx._source.name = params.name",
"params": {
"tags": "dd"
},
"lang": "painless" }
}

使用java api写法

 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must().add(QueryBuilders.termQuery("mdProductId", productCharacterStocksVo.getProductId()));
boolQueryBuilder.must().add(QueryBuilders.termQuery("characterId", productCharacterStocksVo.getCharacterId()));
boolQueryBuilder.must().add(QueryBuilders.termQuery("regionCode", productCharacterStocksVo.getRegionCode()));
boolQueryBuilder.must().add(QueryBuilders.termQuery("ladingFactoryId", productCharacterStocksVo.getFactoryId()));
updateByQueryRequest.setQuery(boolQueryBuilder);
updateByQueryRequest.setScript(new Script(
ScriptType.INLINE, "painless",
"ctx._source.stockCount=" + productCharacterStocksVo.getSumCount(),
Collections.emptyMap()));
try {
log.info(updateByQueryRequest.toString());
BulkByScrollResponse bulkByScrollResponse = eshlRestUtil.getClient().updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
count = bulkByScrollResponse.getUpdated();
}catch (Exception e){
e.printStackTrace();
count=0L;
}

根据条件删除

post:http://127.0.0.1:9200/test_latest/_delete_by_query

{
"query": {
"bool": {
"must": [{
"term": {
"_id": "11"
}
}]
}
}
}

elasticsearch 文档阅读笔记(三)的更多相关文章

  1. Keras 文档阅读笔记(不定期更新)

    目录 Keras 文档阅读笔记(不定期更新) 模型 Sequential 模型方法 Model 类(函数式 API) 方法 层 关于 Keras 网络层 核心层 卷积层 池化层 循环层 融合层 高级激 ...

  2. ElasticSearch文档操作介绍三

    ElasticSearch文档的操作 文档存储位置的计算公式: shard = hash(routing) % number_of_primary_shards 上面公式中,routing 是一个可变 ...

  3. Resin文档阅读笔记

    阅读文档对应的版本为Resin4.0,且基本只关注Standard版本的功能. 1.Resin可以注册为服务: To install the service, use C:/> resin-3. ...

  4. KVM内核文档阅读笔记

    KVM在内核中有丰富的文档,位置在Documentation/virtual/kvm/. 00-INDEX:整个目录的索引及介绍文档. api.txt:KVM用户空间API,所谓的API主要是通过io ...

  5. rocksdb wiki文档阅读笔记

    由于是英文文档,不做笔记过一阵就忘了,现在把关键点记录到这,开发的时候使用. 具体wiki地址:https://github.com/facebook/rocksdb/wiki 1)Column Fa ...

  6. webDriver文档阅读笔记

    一些雷 浏览器版本和对应的Driver的版本是一一对应的,有时候跑不起来,主要是因为driver和浏览器版本对不上. e.g: chrome和driver版本映射表:https://blog.csdn ...

  7. mongodb官网文档阅读笔记:与写性能相关的几个因素

    Indexes 和全部db一样,索引肯定都会引起写性能的下降,mongodb也没啥特别的,相对索引对读性能的提示,这些消耗通常是能够接受的,所以该加入的索引还是要加入.当然须要慎重一些.扯点远的,以前 ...

  8. Unity文档阅读 第三章 依赖注入与Unity

    Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...

  9. Mybatis文档阅读笔记(明日继续更新...)

    今天在编写mybatis的mapper.xml时,发现对sql的配置还不是很熟,有很多一坨一坨的东西,其实是可以抽取成服用的.不过良好的组织代码,还是更重要的.

随机推荐

  1. pat解题报告【1082】

    1082. Read Number in Chinese (25) 时间限制   400 ms 内存限制   32000 kB 代码长度限制   16000 B 判题程序     Standard   ...

  2. Codeforces--617B--Chocolate(规律)

     Chocolate Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit ...

  3. hdoj--5100--Chessboard(数学推理)

     Chessboard Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. HTTP权威协议笔记-8.集成点:网关、隧道及中继

    .8.1 网关 定义:网关类似与翻译器,它抽象出了一种能够到达资源的方法. 实用:网关可以自动将HTTP流量转换为其他协议,这样使用HTTP协议的一方就不需要了解其他协议,也可实现与其他程序或设备交互 ...

  5. mysql出错代码

    1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目 ...

  6. Java 网络IO编程(BIO、NIO、AIO)

    本概念 BIO编程 传统的BIO编程 代码示例: public class Server { final static int PROT = 8765; public static void main ...

  7. C - Gravity Flip

    Problem description Little Chris is bored during his physics lessons (too easy), so he has built a t ...

  8. Obsolete---标记方法 类过期

    最近做一个接口的修改,由于是很老的接口,不太了解外部有多少地方引用了它. 但是内部的方法由于业务发展已经不太适合现在的需求,想改又不该动.所以想到了如果设置为过期. Obsolete 属性将某个程序实 ...

  9. oracle 提示登录密码过期解决

    1.登录到oracle的 服务器 2.切换到oracle 用户 3.设置到当前操作的实例名:export ORACLE_SID=XXX 4.连接数据库的命令行模式:sqlplus /nolog 5.s ...

  10. Deutsch lernen (09)

    1. die Rückmeldung, -en 反馈,回馈:(销假)报到 die Rückmeldung zur Arbeit 2. dringend a. 紧急的,急切的 Ich brauche d ...