ES开发笔记

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ES开发笔记
⼀、es在springboot中的应⽤
现在发现es 和 jpa真的是⾮常⾮常的好⽤!帮助我们做了很多的基本重复性⼯作! elasticsearch 对排序、聚合所依据的字段⽤单独的数据结构(fielddata)缓存到内存⾥⾯了,但是在text字段上是默认禁⽤的,如果需要单独开启,这样做的⽬的是为了节省空间。

在ElasticsearchRepository 中我们可以使⽤not add like or between 等这些关键词构造查询⽅法,⽽jpa会⾃动帮助我们把这些⽅法转化成相应的es语句查询
⼆、ES数据的增删改查
ES中所有对数据的增删改查操作全部都是以标准的restfulAPI的形式进⾏的
(1) 新建⽴⼀个索引
{
"aliases":{
"users":{}
}
}
使⽤GET ⽅法直接请求 /index/type/_search 查询所有的记录
{
"query": {
"bool": {
"must": [
{
"match": {
"userName": "张三"
}
},
{
"match": {
"phoneNum.keyword": "180********"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"aggs": {}
}
增加与更新:统⼀使⽤PUT ⽅法:
{
"id": "1",
"type": 1,
"number": "111",
"unitId": "ddd",
"enterName": "tecent",
"staffNum": 100,
"count": 87,
"createTime": "2020-08-31T00:00:00.380",
"ceoName": "zhugeliang",
"ceoPhone": null,
"salary": null,
"status": 3,
"status3": 3,
"isVisible": null
}
库⾥如果没有这条记录就新增; 如果有就更新,以当前的字段值覆盖旧的字段值
⽰例:根据ID删除
{
"query": {
"bool": {
"must": [
{
"ids": {
"values": "581162270337900545"
}
}
]
}
}
}
删除索引:
rollover index 滚动索引
{
"aliases": {
"log-write": {}
}
}
向logs-000001 新增10条数据
POST log-write/_rollover
{
"conditions": {
"max_age": "1m",
"max_docs": 5,
"max_size": "50mb"
}
}
这意味着上述logs-000001,只要满⾜任何其中⼀条都会新增⼀个索引,并且别名log-write指向新索引
{
"old_index": "logs-000001",
"new_index": "logs-000002",
"rolled_over": true,
"dry_run": false,
"acknowledged": true,
"shards_acknowledged": true,
"conditions": {
"[max_age: 1m]": true,
"[max_docs: 5]": false,
"[max_size: 50mb]": false
}
}
注意:创建新的滚动索引,不会根据触发条件⾃动创建,必须通过⼿动调⽤⼀下 index别名/_rollover 接⼝才会触发,如果满⾜条件才会新创建新索引。

在实际使⽤中,我们会通过定时脚本⼿动刷新滚动更新规则进⾏触发。

es修改索引副本个数
PUT index01/_settings
{
"number_of_replicas": 2
}
es深分页
ElasticSearchTemplate⾥⾯
org.springframework.data.elasticsearch.core.ElasticsearchTemplate#getSearchResponse(org.elasticsearch.action.search.SearchRequestBuilder)
SearchRequestBuilder requestBuilder requestBuilder.toString() 是最后构建出来的全部查询语句,可以查看最终构建的查询语句。

解决深分页的思想有两个:⼀是排序、⼆是控制查询条件。

排序必须保证唯⼀:可⾸先根据⽤户的需求,⽐如先根据createTime进⾏排序,再根据唯⼀性字段ID进⾏⼆次排序。

数据量⼤时,就需要结合上⼀页的返回数据作为下⼀次的查询条件,下⼀次查询createTime⼤于上⼀次查询的末尾时间,或者时间相等,但是ID⼩于上次的,在查询条件上做好控制,就可以控制总的数据返回数量。

因为总的数据返回量如果⼤于10000、结果是会报错的,严重影响ES的性能。

此时加上了时间⼤于上次查询的返回的时间后,就可以设置from 0 size 20 ; 也就是改造之后的第⼀页。

这样查询出来的结果集就会⾮常⼩,效率就会⾮常⾼了
ES集群是分⽚的,加⼊有三个分⽚
假设查询from: 10000 size:20, 由于存在各个分⽚的⼤⼩不均匀的情况,所以,最后协调节点需要读⼊三个分⽚的所有排序之后的10000+20条数据,那最后协调节点就需要对30060条数据,所以可想⽽知
如果随着数据的页码深⼊,ES处理的数据就太⼤了,⼗分地浪费性能。

ES是使⽤Java虚拟机的,GC就⾮常浪费性能和时间。

三、ES集群
聚合bucket桶超过1万就会报警告,可能出现性能问题,解决⽅案:setting⾥设置:search.max_buckets 默认max_buckets 为 -1 ,也就是不加限制,1万是ES所加的默认限制
可以通过设置修改桶的最⼤数量:
{"persistent": {"search.max_buckets": 30000}}
ES分⽚
ES的分⽚,es中的所有数据均衡的存储在集群中的各个节点的分⽚中,简单来讲,分⽚shard 就是ES中所有数据的⽂件块,也是数据的最⼩单元块,整个ES集群的核⼼就是对所有分⽚的分布、索引、负载、路由等达到惊⼈的速度
实例场景
假设indexa 有两个分⽚,我们向indexa 中插⼊10条数据(10 个⽂档),那么10条数据就会尽可能的平均分为5条存储在第⼀个分⽚中,剩下的5条数据会存储在另外⼀个分⽚中。

本案例主要介绍了ES的⼀些核⼼点,以及在项⽬中结合springboot实现对数据的增删改查,最后重点介绍了ES强⼤的多条件查询以及快速的聚合查询。

由于ES存储数据是建⽴倒排索引,⽐MySQL等关系型数据的B+树索引具备更快的索引速度,因此借助ES我们可以更加快速地获取到我们想要的数据。

另外ES还提供了各式各样的聚合查询⽅法,能极⼤地满⾜我们对海量数据的统计分析等需求,使⽤起来也⾮常的便捷。

本案例除了简要的介绍ES的要点之外,还给出ES的应⽤实例,参考该经验案例可以快速的使⽤ES的基础增删改查等功能,还可以使⽤聚合统计等功能满⾜⾃⼰项⽬中的统计分析需求。

Es三类节点的功能:
默认情况下、ES集群节点都是混合节点,即在elasticsearch.yml中默认node.master:true 和 node.data: true.
当ES集群达到⼀定规模之后,就需要注意对集群节点进⾏⾓⾊划分。

ES集群节点主要可以划分为三种:主节点、数据节点和客户端节点。

这是⼀种分⽽治之的思想,也是⼀种术业有专供的体现
三类节点说明:
master节点
elasticsearch.yml
node.master: true
node.data: false
主要功能:维护元数据,管理集群节点状态;不负责数据写⼊和查询
配置要点:内存可以相对⼩⼀些,但是机器⼀定要稳定,最好是独占的机器
data - 数据节点
elasticsearch.yml
node.master: false
node.data: true
主要功能:负责数据的写⼊与查询,压⼒⼤
配置要点:⼤内存,最好是独占的机器
client - 客户端节点
elasticsearch.yml
node.master: false
node.data: false
主要功能:负责任务分发和结果汇聚,分担数据节点的压⼒,主要是针对海量的请求的时候进⾏负载均衡。

如果集群没有设置从client节点,那么这些压⼒都会被分配到data节点上去。

配置要点:⼤内存,最好是独占的机器
查询集群分⽚shard的是否需要分配情况等:
GET(POST) _cluster/allocation/explain
{
"index": "test_enterprise_index",
"shard": 0,
"primary": false,
"current_node": "elasticsearch-data-2"
}
集群节点系统信息的查询:
GET _nodes/os
查询ES集群的⼀些常⽤指标信息可以借助es的监控⼯具cerebro来进⾏操作
more cat apis ⽐如查询
heath 集群健康检查接⼝
nodes 集群节点情况接⼝
ES
该索引下有2w多条数据,经过聚合分桶后,也绝对不仅仅只是10个bucket,很显然,这似乎不是我想要的结果,经过查官⽅API发现下⾯⼀段话:
在聚合中设置 size:0 在2.x之后已被弃⽤,建议为 size 明确设置合理的值,⼀个介于1到2147483647之间的数字。

(⼗亿),size的默认值只有10个这个要⾮常注意,平时也代码也要养成良好的习惯,每次最好明确带上size的值。

⼯具kibana的使⽤:
kibana对es数据的可视化分析统计
注意:kibana需要与es版本相匹配,版本不匹配不能使⽤
docker 快速安装kibana 【以本地连接的es为例,实际使⽤替换为对应环境的ES】
{domain} = ⾃⼰的服务器IP地址
docker pull docker.io/***/kibana/kibana-oss:6.2.3
docker.io/*/kibana/kibana-oss:6.2.3
【删除kibana】
docker stop kibana; docker rm kibana
【查看kibana的⽇志】
docker logs -f kibana
后续使⽤Dev Tools⼯具对Es的操作⾮常地⽅便快捷!
参考⽂档:。

相关文档
最新文档