文档
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此
检索不同index文档
post请求:
参数
{ "docs":[{ "_index":"blogs", "_type":"product", "_id":"1" },{ "_index":"blogs2", "_type":"product", "_id":"2" }] }
结果
{ "docs": [ { "_index": "blogs", "_type": "product", "_id": "1", "_version": 13, "_seq_no": 10, "_primary_term": 1, "found": true, "_source": { "productName": "测试修改", "price": 11, "remark": "不错的床垫", "tags": [ "家具", "床垫", "棉花", null ], "videw": 1 } }, { "_index": "blogs2", "_type": "product", "_id": "2", "_version": 1, "_seq_no": 0, "_primary_term": 1, "found": true, "_source": { "productName": "法瑞思 天然椰棕床垫棕垫硬床垫定做 薄乳胶棕榈榻榻米床垫定制折叠1.2/1.5/1.8", "price": 10, "remark": "不错的床垫", "tags": [ "家具", "床垫", "棉花" ] } } ] }
如果index相同type不同
id和type都相同