elasticsearch 文档阅读笔记(三)
文档
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 文档阅读笔记(三)的更多相关文章
- Keras 文档阅读笔记(不定期更新)
目录 Keras 文档阅读笔记(不定期更新) 模型 Sequential 模型方法 Model 类(函数式 API) 方法 层 关于 Keras 网络层 核心层 卷积层 池化层 循环层 融合层 高级激 ...
- ElasticSearch文档操作介绍三
ElasticSearch文档的操作 文档存储位置的计算公式: shard = hash(routing) % number_of_primary_shards 上面公式中,routing 是一个可变 ...
- Resin文档阅读笔记
阅读文档对应的版本为Resin4.0,且基本只关注Standard版本的功能. 1.Resin可以注册为服务: To install the service, use C:/> resin-3. ...
- KVM内核文档阅读笔记
KVM在内核中有丰富的文档,位置在Documentation/virtual/kvm/. 00-INDEX:整个目录的索引及介绍文档. api.txt:KVM用户空间API,所谓的API主要是通过io ...
- rocksdb wiki文档阅读笔记
由于是英文文档,不做笔记过一阵就忘了,现在把关键点记录到这,开发的时候使用. 具体wiki地址:https://github.com/facebook/rocksdb/wiki 1)Column Fa ...
- webDriver文档阅读笔记
一些雷 浏览器版本和对应的Driver的版本是一一对应的,有时候跑不起来,主要是因为driver和浏览器版本对不上. e.g: chrome和driver版本映射表:https://blog.csdn ...
- mongodb官网文档阅读笔记:与写性能相关的几个因素
Indexes 和全部db一样,索引肯定都会引起写性能的下降,mongodb也没啥特别的,相对索引对读性能的提示,这些消耗通常是能够接受的,所以该加入的索引还是要加入.当然须要慎重一些.扯点远的,以前 ...
- Unity文档阅读 第三章 依赖注入与Unity
Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...
- Mybatis文档阅读笔记(明日继续更新...)
今天在编写mybatis的mapper.xml时,发现对sql的配置还不是很熟,有很多一坨一坨的东西,其实是可以抽取成服用的.不过良好的组织代码,还是更重要的.
随机推荐
- luogu1070 道路游戏 单调队列
题目大意 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 nn 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 nn 个机器人工 ...
- Linux C语言头文件搜索路径
本文介绍在linux中头文件的搜索路径,也就是说你通过include指定的头文件,linux下的gcc编译器它是怎么找到它的呢.在此之前,先了解一个基本概念. 头文件是一种文本文件,使用文本编辑器将代 ...
- codeforces 915D Almost Acyclic Graph 拓扑排序
大意:给出一个有向图,问能否在只去掉一条边的情况下破掉所有的环 解析:最直接的是枚举每个边,将其禁用,然后在图中找环,如果可以就YES,都不行就NO 复杂度O(N*M)看起来不超时 但是实现了以后发现 ...
- How to add dependency on a Windows Service AFTER the service is installed
his can also be done via an elevated command prompt using the sc command. The syntax is: sc config [ ...
- c++之——————各种变量
对我们程序员来讲,“变量”和“对象”是可以相互互换使用的.-------------开篇之词. 变量:提供一个具有名字的可供程序操作的存储空间.由类型说明符和其后紧跟的数个列表组成,其中变量名之间使用 ...
- Snowflake Snow Snowflakes(查找)
http://poj.org/problem?id=3349 题意:给出n组数据,每组数据有六个数,这n组数据中若有两组数据不管是从某个数顺时针读还是逆时针读都相同,输出“Twin snowflake ...
- 【BZOJ4590】自动刷题机
[思路分析] 比赛的时候想到了用二分+贪心,二分的部分与贪心的部分也写对了,但是由于数据范围未看没有开long long,且二分左端点赋值过小导致WA掉 正解:二分+贪心 二分代码的长度,贪心判断能否 ...
- windows系统下nodejs安装、环境配置及删除NPM全局配置
nodejs安装及设置NPM全局路径 删除NPM全局路径配置 一.nodejs安装及设置NPM全局路径 第一步:下载安装文件 下载nodejs,官网:http://nodejs.org/downloa ...
- 缓存,队列(Redis,RabbitMQ)
Redis Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- Java 精度控制
四舍五入,保留两位小数 (找了很多种方法,都有问题,测试得出下面这种方式是可用的) String str="0.235"; String.format("%.2f&quo ...