别只会搜日志了,求你懂点检索原理吧(四)之 初阶检索玩法

简介: 别只会搜日志了,求你懂点检索原理吧(四)之 初阶检索玩法

四、初阶检索玩法

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 存储空间。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5月前
|
存储 缓存 Java
浅析JAVA日志中的几则性能实践与原理解释
本篇文章通过几个技术点说明日志记录过程中的性能实践,计算机领域的性能往往都遵循着冰山法则,即你能看得见的、程序员能感知的只是其中的一小部分,还有大量的细节隐藏在冰山之下。
680 1
|
2月前
|
存储 SQL 关系型数据库
[MySQL]事务原理之redo log,undo log
[MySQL]事务原理之redo log,undo log
127 0
|
4月前
|
Java Spring
Spring5深入浅出篇:Spring工厂简单原理以及日志应用
Spring5深入浅出篇:Spring工厂简单原理以及日志应用
|
4月前
|
监控 Shell 测试技术
Appium日志分析总结Appium工作原理
Appium日志分析总结Appium工作原理
35 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL-binlog日志原理
MySQL-binlog日志原理
|
6月前
|
消息中间件 Kafka 数据库
淘东电商项目(48) -ELK+Kafka分布式日志收集(原理篇)
淘东电商项目(48) -ELK+Kafka分布式日志收集(原理篇)
50 0
淘东电商项目(48) -ELK+Kafka分布式日志收集(原理篇)
|
7月前
|
SQL 存储 关系型数据库
【面试题精讲】MySQL-binlog日志原理
【面试题精讲】MySQL-binlog日志原理
|
5天前
|
C++
JNI Log 日志输出
JNI Log 日志输出
13 1
|
5天前
|
存储 运维 大数据
聊聊日志硬扫描,阿里 Log Scan 的设计与实践
泛日志(Log/Trace/Metric)是大数据的重要组成,伴随着每一年业务峰值的新脉冲,日志数据量在快速增长。同时,业务数字化运营、软件可观测性等浪潮又在对日志的存储、计算提出更高的要求。
|
11天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。