文档

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. 源码中修改Android的开机画面和动画【转】

    本文转载自:http://blog.csdn.net/dddxxxx/article/details/54343976 参照文章:http://blog.csdn.net/a345017062/art ...

  2. bzoj 4198 [ Noi 2015 ] 荷马史诗 —— 哈夫曼编码(k叉哈夫曼树)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 第一次写哈夫曼树!看了很多博客. 哈夫曼树 & 哈夫曼编码:https://w ...

  3. 杂项:Web API

    ylbtech-杂项:Web API 今天的web计算平台包含了广泛的功能,其中的大部分均可以通过API(应用程序编程接口)访问. 从简单的社会书签服务del.icio.us,到复杂得多的amazon ...

  4. SQL Server2012 T-SQL基础教程--读书笔记(5-7章)

    SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5. ...

  5. This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery

    This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'的意思是,这版本的 MySQL 不支持使 ...

  6. (Go)07.Go语言中strings和strconv包示例代码详解01

    1.strings使用 前缀和后缀 HasPrefix判断字符串s是否以prefix开头: 示例: package main import ( "fmt" "string ...

  7. PCB C# 连接MongoDB 数据库

    一.C# MongoDB 驱动下载 1.百度网盘:nuget下载地址(V2.7版本) https://pan.baidu.com/s/1VDsVcH1TMrXqhRCZVewZgA 2.VS 中NUg ...

  8. yii widget使用的3个用法

    yii视图中使用的widget方式总结:常用的有3种方式:一.显示详细信息: $this->widget('zii.widgets.CDetailView', array( 'data' =&g ...

  9. ruby --Paperclip::NotIdentifiedByImageMagickError

    首先,如果遇到这个问题,Paperclip::NotIdentifiedByImageMagickError,先检查下环境变量是否配置了ImagicMagick的路径. cmd下path 查看,首先加 ...

  10. rabbitmq镜像模式初体验

    rabbitmq-01: yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm wget ...