ElasticSearch开发指北和场景题分析

news2025/1/20 11:56:35

前言

本篇是ES系列的第二篇,继上次的理论篇ElasticSearch理论体系构建后,带来了实战篇。实战篇来自于我对常见操作以及场景的分析总结,详细到每个步骤和理由,下一篇将是性能优化篇。

常用操作

以下操作均使用ES的API进行展示,为什么这么做呢,而不是选用某一个程序代码来进行演示?原因是我认为,ES的核心在于API,无论是Java、python等包装的操作客户端,哪怕语法用得再厉害,无非就是对原生Restful API的封装罢了。再说了大部分客户端都支持直接丢个Json进去,你掌握了API的写法,其实用什么语言都能很快上手。

索引操作

创建索引–最基础的操作,一般建议是直接如下案例,一次性建好配置和映射还有别名,避免多次IO


PUT /索引名称 { "settings": { "属性名": "属性值" } }
PUT /flink-test1
{
  "settings": {
    "number_of_shards": 6,
    "number_of_replicas": 1,
    "refresh_interval": "5s",
    "translog.durability": "async",
    "translog.sync_interval": "30s",
    "index.highlight.max_analyzed_offset": 2000000
  },
  "aliases": {
    "flink-test": {}
  },
  "mappings": {
    "properties": {
      "userId": {
        "type": "keyword"
      },
      "userName": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      },
      "requestUrl": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      },
      "requestType": {
        "type": "keyword"
      },
      "logType": {
        "type": "keyword"
      },
      "requestMethod": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      },
      "env": {
        "type": "keyword"
      },
      "localIp": {
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "requestIp": {
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "triceId": {
        "type": "keyword"
      },
      "createTime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss.SSS"
      },
      "system": {
        "type": "keyword"
      },
      "threadName": {
        "type": "keyword"
      },
      "msg": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      }
    }
  }
}

判断索引是否存在–HEAD /索引名称
查看索引–GET** /索引名称
批量查看索引–GET
**/索引名称1,索引名称2,索引名称3,…
查看所有索引–GET _all
概要信息– GET /_cat/indices?v
查询主节点–GET /_cat/master
打开索引–POST /索引名称/_open
关闭索引–POST /索引名称/_close
删除索引–DELETE /索引名称1,索引名称2,索引名称3…
创建映射字段

PUT /索引库名/_mapping
{
    "properties": {
        "字段名": {
            "type": "类型",  
            "index": true"store": true"analyzer": "分词器"
        }
    }
}

查看映射关系–GET** **/索引名称/_mapping
一次性创建索引和映射

PUT /索引库名称
{
    "settings":{
        "索引库属性名":"索引库属性值"
        },
    "mappings":{
        "properties":{
            "字段名":{
            "映射属性名":"映射属性值"
            }
        }
    }
}

查看索引配置–GET** **/索引名称/_settings
修改索引配置

PUT /log-zero-uat-202211/_settings
{
  "index" : {
    "highlight.max_analyzed_offset" : 500000
  }
}

文档操作

新增文档–第一种指定ID,不推荐,建议使用第二种不指定ID,由ES自动生成

POST /索引名称/_doc/{id}
POST /test111/_doc
{
  "name" : "百度",
  "job" : "小度用户运营经理",
  "payment" : "30000"
}

查看单个文档–GET** **/索引名称/_doc/{id}
查看所有文档

POST /索引名称/_search
{
    "query":{
        "match_all": {}
    }
}

查询指定列–GET /索引名称/_doc/1?_source=name,job
更新文档

全部更新,是直接把之前的老数据,标记为删除状态,然后,再添加一条更新的(使用PUT或者POST)局域更新,只是修改某个字段(使用POST)
全部更新
把刚才新增的请求方式改为PUT,就是修改了,不过修改必须指定id,如果id对应文档存在,则修改;如果id对应文档不存在,则新增
局部更新
POST /索引名/_update/{id}
{
    "doc":{
        "field":"value"
    }
}

删除文档

根据id进行删除:
DELETE /索引名/_doc/{id}
删除所有文档
POST /my-index-000001/_delete_by_query
{
  "query": {
    "match": {
      "user.id": "elkbee"
    }
  }
}

查询日期大于XXX的字段

GET /log-zero-pro-202203-alias1/_search
{
  "query": { 
    "bool": { 
      "filter": [ 
        { "range": { "createTime": { "gte": "2022-03-31 08:00:00.000" }}}
      ]
    }
  }
}

方案操作文档

常规操作还有很多,后面慢慢补充吧,没有放很多复杂的东西进去,毕竟大家的业务都不一样,照着官网案例写就行了,我觉得8.X的文档写的比7.X的垃圾多了,不知道是不是我的错觉,少了很多案例。下面带来一些经典的ES实操案例,让大家快速了解ES。

ES集群添加插件(分词器)或修改配置-需要滚动重启

  1. 禁止分片自动分布。这个很好理解,避免新节点进来,分片数据重分配,不会影响数据的正确性,同时不用重分配也加速了咱们切换的时间。
PUT /_cluster/settings
{
  "transient" : {
    "cluster.routing.allocation.enable" : "none"
  }
}
  1. 执行同步刷新。在关闭节点前,把内存中的数据刷入磁盘,避免丢失数据。
    :::info
    curl -X POST “localhost:9200/_flush/synced”
    /_flush/synced API的主要的作用和场景有:

  2. 强制执行挂起的索引刷新,使文档可搜索。默认情况下,Elasticsearch会定期自动刷新,但调用/_flush/synced可以手动刷新。

  3. 在做故障转移之前,调用该API可以确保主分片已经完成所有的索引操作。否则故障转移可能会失去数据。

  4. 与_flush不同,_synced会进行额外的处理,确保主分片和副本分片都完成了刷新。
    :::

  5. 关闭单个节点,添加分词器或者修改配置之类的,重启节点

  6. 观察该节点是否加入集群,检查下是否正常启动,都OK,就开启分片自动分片,等待集群状态恢复正常

PUT /_cluster/settings
{
    "transient" : {
        "cluster.routing.allocation.enable" : "all"
    }
}
  1. 对剩余节点进行以上1-4重复操作,即可完成滚动重启

ES集群重建索引-无需重启

ElasticSearch不停机重建索引引申来的优化与思考-阅读5137点赞28收藏43,直接看我写的这篇文章吧,详细多了,就不赘述了。

Elasticsearch时区问题

Elasticsearch 滞后8个小时等时区问题,一网打尽!
推荐上面那篇文章,大佬写得很好,总结一下就是,ES默认时区UTC+0改不了,只能适应它,但是Kibana和查询API可以换时区曲线救国。当然我们不能指望查询时去改数据,最好做到输入到ES里的数据就是我们想要的时区。

“createTime”:{“type”:“date”,“format”:“yyyy-MM-dd HH:mm:ss.SSS”},我的映射结构是这种的,我在输入数据的时候,考虑两种做法。第一种是如Filebeat+Kafka+数据处理服务+Elasticsearch+Kibana+Skywalking日志收集系统,文中的处理,在输入端,将日期时间主动修改为和ES默认一致的时区,这样转换后的数据依旧是我们想要的时间。
image.png
第二种是向ES发送请求时,比如是Java客户端,在JSON转换时加上时区@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss.SSS”,timezone=“GMT+8”),注意我这里用的是Jackson序列化工具,所以注解用的JsonFormat,如果Spring全局替换为Fastjson就改下注解就行。

ES字段调整的另一个办法

不必Reindex,利用runtime_fields优雅地解决字段类型错误问题
这是ES社区写的一篇文章,里面提到了这个运行时字段,是ES较高版本给出的一个解决措施。里面只提到了它的优点,就是灵活性强且不占用存储空间,因为他是在查询期间动态运算的,所以运行时字段并不在实际的文档中存储。也就是说,你加了这个运行时字段,其实索引大小是不会变的,但是查询的时候,可以用这个字段查出数据,特定情况也算是提高了性能,如果是频繁修改索引的业务场景,那么使用运行时字段,就不会引发索引的频繁构建。

但是文章里没说缺点,这就很坑人了,所以我来说说。运行时处理,由这个关键词很容易想到,这是一种时间换空间的手法,必然会拉长查询速度,同时耗费多余的计算资源。总之使用的时候见仁见智吧,和前面的滚动停机以及不停机的两种方案各有优劣。

问题解决

高亮文本解析字符数超过默认值报错


The length of [msg] field of [WKO61oEB7lnawBKq29Pl] doc of [log-zero-uat-202207-alias1] index has exceeded [1000000] - maximum allowed to be analyzed for highlighting. This maximum can be set by changing the [index.highlight.max_analyzed_offset] index level setting. For large texts, indexing with offsets or term vectors is recommended!

该问题常见于Kibana查询时报错,因为我们带条件查询的时候,kibanna默认使用高亮查询,而ES为了加快响应速度将默认解析字符数设置为10w,我们在操作的时候可以将索引的相关设置调整为100w

PUT /索引名称/_settings
{ "index": { "highlight.max_analyzed_offset": 10000000 } }

text类型默认不支持聚合和排序

报错内容:
:::info
Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [userId] in order to load field data by uninverting the inverted index. Note that this can use significant memory(文本字段未针对需要每个文档字段数据的操作(如聚合和排序)进行优化,因此默认情况下禁用这些操作。请改用关键字字段。或者,在 [userId] 上设置 fielddata=true,以便通过反转倒排索引来加载字段数据。请注意,这可能会占用大量内存)
:::
解决方案:
text类型默认不支持聚合和排序,因此要么修改mapping增加属性fielddata=true,或者直接修改字段类型为keyword

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1557060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构进阶篇 之 【二叉树顺序存储(堆)】的整体实现讲解(赋完整实现代码)

做人要谦虚,多听听别人的意见,然后记录下来,看看谁对你有意见 一、二叉树的顺序(堆)结构及实现 1.二叉树的顺序结构 2.堆的概念及结构 3.堆的实现 3.1 向下调整算法 AdJustDown 3.2 向上调整算法 AdJustUP 3.3 …

【系统架构师】-第18章-安全架构设计

(1)信息泄露:信息被泄露或透露给某个非授权的实体。 (2)破坏信息的完整性:数据被非授权地进行增删、修改或破坏而受到损失。 (3)拒绝服务:对信息或其他资源的合法访问被无条件地阻止。 (4)非法使用(非授权访问):某一资源被某个非授权的人或…

深度学习500问——Chapter05: 卷积神经网络(CNN)(2)

文章目录 5.6 有哪些池化方法 5.7 1x1卷积作用 5.8 卷积层和池化层有什么区别 5.9 卷积核是否一定越大越好 5.10 每层卷积是否只能用一种尺寸的卷积核 5.11 怎样才能减少卷积层参数量 5.12 在进行卷积操作时,必须同时考虑通道和区域吗 5.13 采用宽卷积的好处有什么 …

Linux部署Sonarqube+Gogs+Jenkins(一)

Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录,并且进行解压3. 配置文件/etc/profile,配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…

Redis 的慢日志

Redis 的慢日志 Redis 的慢日志(Slow Log)是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈,定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…

自定义类型(二)结构体位段,联合体,枚举

这周一时兴起,想写两篇文章来拿个卷吧,今天也是又来写一篇博客了,也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己,所以要给自己的努力留下足迹。 为今天努力的自己打个卡,留个痕迹吧 2024.03.30 小闭…

GitHub文件克隆到本地(GitHub desktop快速上手版)

使用 GitHub Desktop 轻松地克隆 GitHub 上的项目。 打开 GitHub Desktop 应用程序。 在菜单栏中,单击“文件”,然后选择“克隆存储库”。 在弹出的窗口中,选择要克隆的存储库: 单击与要克隆的仓库位置对应的选项卡。或者&#…

回溯算法|216.组合总和III

力扣题目链接 class Solution { private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果// targetSum&#xff1a;目标和&#xff0c;也就是题目中的n。// k&#xff1a;题目中要求k个数的集合。// sum&#xff1a;已经收集…

【Quixel Mixer】简单介绍

一、下载 官网下载地址&#xff1a;Quixel Mixer - All-in-one texturing & material creation tool 下载好之后双击exe来安装 等待安装完成 下载后打开&#xff0c;新建一个工程和Mix 二、界面介绍 我们先将软件界面分为如下3个部分 1号区域为菜单栏 2号区域介绍 2号…

【Linux】POSIX信号量{基于环形队列的PC模型/理解信号量的出现/参考代码}

文章目录 1.POSIX信号量1.1介绍1.2接口 2.基于环形队列的PC模型2.1环形队列常用计算2.2如何设计&#xff1f;2.3如何实现&#xff1f; 3.细节处理3.1空间资源和数据资源3.2push/pop3.3理解信号量的出现1.回顾基于阻塞队列的PC模型中条件变量的使用2.如何理解信号量的投入使用&a…

数据结构:链表的双指针技巧

文章目录 一、链表相交问题二、单链表判环问题三、回文链表四、重排链表结点 初学双指针的同学&#xff0c;请先弄懂删除链表的倒数第 N 个结点。 并且在学习这一节时&#xff0c;不要将思维固化&#xff0c;认为只能这样做&#xff0c;这里的做法只是技巧。 一、链表相交问题 …

报错:ImportError: cannot import name ‘imread‘ from ‘scipy.misc‘

报错内容&#xff1a; 问题代码通常是导入scipy库的版本出现了问题。 解决方法&#xff1a; 方法一&#xff1a; scipy版本还原到1.2.0 pip install scipy1.2.0 方法二&#xff1a; 使用from imageio import imread进行替换from scipy.misc import imread 使用imageio库同…

预处理详解(二)-- 条件编译 - 头文件包含 - ##和#运算符

目录 一.##和#运算符1.#运算符&#xff08;字符串化&#xff09;2.##运算符&#xff08;粘合符&#xff09; 二.条件编译&#xff08;很重要&#xff09;三.命名约定1.宏名的命名2.函数的命名 四.#undef(用于移除一个宏定义)五.命名行约定六.头文件被包含的方式1.本地文件包含2…

推特Twitter有直播功能吗?如何用Twitter直播?

现在各大直播平台已经成为社交媒体营销的一种重要渠道&#xff0c;它让品牌能够即时地与全球受众进行互动。据统计&#xff0c;直播市场正在迅速增长&#xff0c;预计到2028年将达到2230亿美元的规模。在这个不断扩张的市场中&#xff0c;许多社交媒体平台如YouTube、Facebook、…

消息队列的七种经典应用场景

在笔者心中&#xff0c;消息队列&#xff0c;缓存&#xff0c;分库分表是高并发解决方案三剑客。 在职业生涯中&#xff0c;笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章&#xff0c;笔者结合自己的真实经历&#xff0c;和大家分享…

在ROS上快速验证PID算法

在ROS上快速验证PID算法 前言 最近有在外面出差授课的工作任务&#xff0c;其中有一个环节是给大家讲述PID相关的内容&#xff0c;在制作相关PPT的时候查询了很多资料&#xff0c;但是写着写着突然意识到一个问题&#xff0c;PID已经在控制专业学习过程以及工程开发时间中那么…

量化交易入门(二十五)什么是RSI,原理和炒股实操

前面我们了解了KDJ&#xff0c;MACD&#xff0c;MTM三个技术指标&#xff0c;也进行了回测&#xff0c;结果有好有坏&#xff0c;今天我们来学习第四个指标RSI。RSI指标全称是相对强弱指标(Relative Strength Index),是通过比较一段时期内的平均收盘涨数和平均收盘跌数来分析市…

【YOLOv5改进系列(9)】高效涨点----使用CAM(上下文增强模块)替换掉yolov5中的SPPF模块

文章目录 &#x1f680;&#x1f680;&#x1f680;前言一、1️⃣ CAM模块详细介绍二、2️⃣CAM模块的三种融合模式三、3️⃣如何添加CAM模块3.1 &#x1f393; 添加CAM模块代码3.2 ✨添加yolov5s_CAM.yaml文件3.3 ⭐️修改yolo.py文相关文件 四、4️⃣实验结果4.1 &#x1f39…

HTB devvortex靶机记录

做这个靶机的师傅们我先提一句&#xff0c;不知道是否是因为网速还是其他因素影响&#xff0c;登录后台管理后&#xff0c;有大概率会被其他人挤下去&#xff0c;所以做这道题的师傅可以考虑在没人的时候去做。 打开靶场以后老规矩nmap扫一遍 这里爆出了80端口和22端口&#xf…

解决Veeam做Replication复制或备份任务并发数量少问题

Veeam执行replication复制或者备份任务时&#xff0c;一直都只有两个任务并发在跑&#xff0c;其他同时间任务只能等待前两个任务处理完才可以开始。 解决方法&#xff1a; 进入Veeam-Bacup Infrastructure-Backup Proxies&#xff0c;可以看到VMware Backup Proxy&#xff0…