PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法

盛年不重来,一日难再晨,及时当勉励,岁月不待人。这篇文章主要讲述PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法相关的知识,希望能为你提供帮助。
Passjava (佳必过) 项目全套学习教程连载中,关注公众号悟空聊架构第一时间获取。
文档在线地址: www.passjava.cn
ElastiscSearch 系列文章的内容如下:

PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法

文章图片

初阶检索玩法 4.1._cat 用法
GET /_cat/nodes: 查看所有节点 GET /_cat/health: 查看 es 健康状况 GET /_cat/master: 查看主节点 GET /_cat/indices: 查看所有索引查询汇总: /_cat/allocation /_cat/shards /_cat/shards/index /_cat/master /_cat/nodes /_cat/tasks /_cat/indices /_cat/indices/index /_cat/segments /_cat/segments/index /_cat/count /_cat/count/index /_cat/recovery /_cat/recovery/index /_cat/health /_cat/pending_tasks /_cat/aliases /_cat/aliases/alias /_cat/thread_pool /_cat/thread_pool/thread_pools /_cat/plugins /_cat/fielddata /_cat/fielddata/fields /_cat/nodeattrs /_cat/repositories /_cat/snapshots/repository /_cat/templates

4.2. 索引一个文档 ( 保存 )例子:在 customer 索引下的 external 类型下保存标识为 1 的数据。
  • 使用 Kibana 的 Dev Tools 来创建
PUT member/external/1"name":"jay huang"

Reponse:
"_index": "member", //在哪个索引 "_type": "external",//在那个类型 "_id": "2",//记录 id "_version": 7,//版本号 "result": "updated",//操作类型 "_shards": "total": 2, "successful": 1, "failed": 0 , "_seq_no": 9, "_primary_term": 1

  • 也可以通过 Postman 工具发送请求来创建记录。
PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法

文章图片

注意:
PUT 和 POST 都可以创建记录。
POST:如果不指定 id,自动生成 id。如果指定 id,则修改这条记录,并新增版本号。
PUT:必须指定 id,如果没有这条记录,则新增,如果有,则更新。
4.3 查询文档
请求:http://192.168.56.10:9200/member/external/2Reposne:"_index": "member",//在哪个索引 "_type": "external",//在那个类型 "_id": "2",//记录 id "_version": 7,//版本号 "_seq_no": 9,//并发控制字段,每次更新就会+1,用来做乐观锁 "_primary_term": 1,//同上,主分片重新分配,如重启,就会变化 "found": true, "_source"://真正的内容 "name": "jay huang"

_seq_no 用作乐观锁
每次更新完数据后,_seq_no 就会+1,所以可以用作并发控制。
当更新记录时,如果_seq_no 与预设的值不一致,则表示记录已经被至少更新了一次,不允许本次更新。
用法如下:
请求更新记录 2: http://192.168.56.10:9200/member/external/2?if_seq_no=9& & if_primary_term=1 返回结果:"_index": "member", "_type": "external", "_id": "2", "_version": 9, "result": "updated", "_shards": "total": 2, "successful": 1, "failed": 0 , "_seq_no": 11, "_primary_term": 1

_seq_no 等于 10,且_primary_term=1 时更新数据,执行一次请求后,再执行上面的请求则会报错:版本冲突
"error": "root_cause": [ "type": "version_conflict_engine_exception", "reason": "[2]: version conflict, required seqNo [10], primary term [1]. current document has seqNo [11] and primary term [1]", "index_uuid": "CX6uwPBKRByWpuym9rMuxQ", "shard": "0", "index": "member" ], "type": "version_conflict_engine_exception", "reason": "[2]: version conflict, required seqNo [10], primary term [1]. current document has seqNo [11] and primary term [1]", "index_uuid": "CX6uwPBKRByWpuym9rMuxQ", "shard": "0", "index": "member" , "status": 409

4.4 更新文档
  • 用法
POST 带 _update 的更新操作,如果原数据没有变化,则 repsonse 中的 result 返回 noop ( 没有任何操作 ) ,version 也不会变化。
请求体中需要用 doc 将请求数据包装起来。
POST 请求:http://192.168.56.10:9200/member/external/2/_update"doc": "name":"jay huang" 响应:"_index": "member", "_type": "external", "_id": "2", "_version": 12, "result": "noop", "_shards": "total": 0, "successful": 0, "failed": 0 , "_seq_no": 14, "_primary_term": 1

使用场景:对于大并发更新,建议不带 _update。对于大并发查询,少量更新的场景,可以带_update,进行对比更新。
  • 更新时增加属性
    请求体中增加 age 属性
http://192.168.56.10:9200/member/external/2/_update request:"doc": "name":"jay huang", "age": 18 response:"_index": "member", "_type": "external", "_id": "2", "_version": 13, "result": "updated", "_shards": "total": 2, "successful": 1, "failed": 0 , "_seq_no": 15, "_primary_term": 1

4.5 删除文档和索引
  • 删除文档
DELETE 请求:http://192.168.56.10:9200/member/external/2 response:"_index": "member", "_type": "external", "_id": "2", "_version": 2, "result": "deleted", "_shards": "total": 2, "successful": 1, "failed": 0 , "_seq_no": 1, "_primary_term": 1

  • 删除索引
DELETE 请求:http://192.168.56.10:9200/member repsonse:"acknowledged": true

  • 没有删除类型的功能
4.6 批量导入数据使用 kinaba 的 dev tools 工具,输入以下语句
POST /member/external/_bulk "index":"_id":"1" "name":"Jay Huang" "index":"_id":"2" "name":"Jackson Huang"

执行结果如下图所示:
PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法

文章图片

  • 拷贝官方样本数据
    https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json

    【PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法】
    PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法

    文章图片

  • 在 kibana 中执行脚本
POST /bank/account/_bulk "index":"_id":"1" "account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL" "index":"_id":"6" ......

PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法

文章图片

  • 查看所有索引
    PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法

    文章图片

可以从返回结果中看到 bank 索引有 1000 条数据,占用了 440.2kb 存储空间。
作者简介:8 年互联网职场老兵|全栈工程师|90 后超级奶爸|开源践行者|公众号万粉原创号主。蓝桥签约作者,著有《JVM 性能调优实战》专栏,手写了一套 7 万字 SpringCloud 实战总结和 3 万字分布式算法总结。公众号「悟空聊架构」,免费获取资料学习。
个人网站:www.passjava.cn

    推荐阅读