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

Posted 公众号_悟空聊架构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法相关的知识,希望对你有一定的参考价值。

PassJava (佳必过) 项目全套学习教程连载中,关注公众号悟空聊架构第一时间获取。

文档在线地址: www.passjava.cn

ElastiscSearch 系列文章的内容如下:

初阶检索玩法

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 工具发送请求来创建记录。

注意:

PUT 和 POST 都可以创建记录。

POST:如果不指定 id,自动生成 id。如果指定 id,则修改这条记录,并新增版本号。

PUT:必须指定 id,如果没有这条记录,则新增,如果有,则更新。

4.3 查询文档

请求:http://192.168.56.10:9200/member/external/2

Reposne:

    "_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"

执行结果如下图所示:

  • 拷贝官方样本数据

    https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json

  • 在 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"
......

  • 查看所有索引

可以从返回结果中看到 bank 索引有 1000 条数据,占用了 440.2kb 存储空间。

作者简介:8 年互联网职场老兵|全栈工程师|90 后超级奶爸|开源践行者|公众号万粉原创号主。蓝桥签约作者,著有《JVM 性能调优实战》专栏,手写了一套 7 万字 SpringCloud 实战总结和 3 万字分布式算法总结。公众号「悟空聊架构」,免费获取资料学习。

个人网站:www.passjava.cn

以上是关于PassJava 开源项目(十九)之 详解 Elasticsearch 初阶检索玩法的主要内容,如果未能解决你的问题,请参考以下文章

PassJava 开源项目(十六):Elasticsearch 简介

PassJava 开源 : Spring Cloud 整合Gateway网关 #私藏项目实操分享#

PassJava 开源 : Spring Cloud 整合 Nacos 配置中心 #私藏项目实操分享#

PassJava 开源 : 整合 OpenFeign实现声明式远程调用 #私藏项目实操分享#

PassJava 开源 : Spring Cloud 整合Gateway网关 #私藏项目实操分享#

PassJava 开源(十三) : Spring Cloud 整合 OSS 对象存储 #私藏项目实操分享#