
elasticsearch
dis_max查询速度慢的问题
Elasticsearch • God_lockin 回复了问题 • 3 人关注 • 3 个回复 • 131 次浏览 • 4 天前
如何定位慢查询请求或错误查询请求的访问Ip
Elasticsearch • caster_QL 回复了问题 • 3 人关注 • 2 个回复 • 161 次浏览 • 5 天前
match_phrase_prefix返回结果如何使越靠前的单词占有的权重越高,排序更靠前
Elasticsearch • xiaowuge 回复了问题 • 4 人关注 • 2 个回复 • 162 次浏览 • 5 天前
是否存在Solr query URL到ES query DSL工具?
Elasticsearch • printlove 回复了问题 • 2 人关注 • 1 个回复 • 944 次浏览 • 6 天前
es的统计监控里观察到 index的次数和get的次数对不上
回复Elasticsearch • code4j 发起了问题 • 1 人关注 • 0 个回复 • 152 次浏览 • 2021-12-02 15:02
发布一个免费的 Elasticsearch 多集群监控和管理平台 - 极限数据平台
Elasticsearch • medcl 发表了文章 • 12 个评论 • 1658 次浏览 • 2021-11-22 18:48
随着单个 Elasticsearch 集群规模的越来越大,大家要么在拆集群的路上,要么是已经是多套集群了, 据路边社消息,一个公司超过5个集群的情况已经变得非常普遍,而管理多个集群着实是有点痛苦,比如常规的玩法可能是一套集群一个 Kibana,集群一多,切换来切换去就有点懵圈了有木有?
作为一个优雅的程序员或者运维管理员,是可忍孰不可忍啊。
另外,多个集群的监控也是一个麻烦事,目前常见的几种监控如:
- 使用 Kibana 自带的监控
- 使用 Prometheus + Grafana
- 使用 Zabbix
Kibana 自带的监控可以很好的满足单个集群的监控场景,不过集群规模大了之后,经常会出现指标丢失的问题,如果使用单独的监控集群,需要修改每个节点的配置,集群都需要重启,对于已经上了生产的集群,有点不方便,另外多集群监控需要商业授权。
那 Prometheus 呢, 一个 Elasticsearch 集群如果要监控起来,首先需要部署一个 Exporter 来暴露集群指标,然后部署一套Prometheus 来采集 Elasticsearch 指标,采集完了之后再部署一套 Grafana 来进行报表分析,不同的集群要做好切换,简单的事情,搞复杂了,整个监控体系偏重,维护成本高。
Zabbix 和 Prometheus 的场景差不多,就不赘述了。
那么问题来了,有没有一个更加简单方便的多集群监控和管理方案呢,并且要支持不同版本的集群,最好是 v2、v5、v6、v7 以及最新的 v8 都能统统接管,哈哈,没错了,这里给大家介绍一个我们极限实验室团队最近开发出来的一款免费的多集群监控和管理工具-极限数据平台,目前版本 v0.1,新鲜出炉。
废话不多少,咱们直接看图说话:
首先是多集群的纳管,目前从 1.0 到最新的 8.0 统统都可以接进来。
然后就是集群的监控拉,要多简单有多简单,就是一个开关的事情,注册集群的时候,启用即开启监控,目标集群啥都不用动,费那劲干啥。
监控界面如图:
集群概览,总体情况一目了然。
各个节点信息,分门别类。
各个索引级别的信息,挨个查看。
多个集群之间的监控查看一键切换,非常方便。
查看监控的时候,发现不对劲,要操作一下集群,直接调出控制台,如下图:
常用的操作命令,可以保存起来,方便下次使用。
别再保存在记事本里面了,下次又找不到,直接加载执行就好了。
好了,你要是用 Elasticsearch 不知道这个工具,那就 out 了,赶快耍起来吧。
下载地址:
https://release.www.ksh17j.com/console/snapshot/
安装巨简单,简直懒得说,一个二进制可执行文件,一个 yml 配置文件,里面修改 Elasticsearch 地址,结束。
可以在这里查看
最后,欢迎关注极限实验室,获取更多 Elasticsearch 免费工具及业界资讯的第一手消息。
极限网关入门视频教程已发布
Elasticsearch • medcl 发表了文章 • 4 个评论 • 242 次浏览 • 2021-11-21 11:41
Elastic 中国开发者大会 2021 开启了,预热铁粉票已开抢,手慢无!
活动 • liaosy 发表了文章 • 0 个评论 • 343 次浏览 • 2021-11-11 17:45
es的基础安全从哪个版本开始免费
Elasticsearch • envy666 回复了问题 • 2 人关注 • 1 个回复 • 227 次浏览 • 2021-11-04 08:49
cat/indices 查看有nested对象的index文档数量有延迟
Elasticsearch • Charele 回复了问题 • 2 人关注 • 1 个回复 • 166 次浏览 • 2021-10-22 16:35
给Zblogphp插上Elasticsearch的翅膀
Elasticsearch • 森 发表了文章 • 0 个评论 • 325 次浏览 • 2021-10-11 23:00
通过python脚本迁移ES的template模板
Elasticsearch • 森 发表了文章 • 0 个评论 • 320 次浏览 • 2021-09-30 09:30
通过python脚本迁移ES的template模板
通过python脚本迁移ES的template模板,从192.168.0.1 迁移到 192.168.0.2
import base64
import json
import requests
def putTemplate(templateName, templateDslJson):
print("{0} 索引模板正在迁移中".format(templateName))
res = requests.put("https://192.168.0.2:9200/_template/{0}".format(templateName), json=templateDslJson)
print(res.status_code)
print(res.content)
def getTemplateDslJson():
username = "elastic"
password = "123456"
user_info_str = username + ":" + password
user_info = base64.b64encode(user_info_str.encode()) # 这个得到是个字节类型的数据
headers = {
"Authorization": "Basic {0}".format(user_info.decode()) # 这个就是需要验证的信息
}
url = "https://192.168.0.1:9200/_template/*_template"
res = requests.get(url, headers=headers)
print(res.status_code)
return json.loads(res.content)
if __name__ == '__main__':
jsonTemplate = getTemplateDslJson()
if isinstance(jsonTemplate, dict):
for templateName in jsonTemplate:
templateDslJson = jsonTemplate[templateName]
putTemplate(templateName, templateDslJson)
es7.6副本越少检索速度越快
Elasticsearch • tongchuan1992 回复了问题 • 3 人关注 • 3 个回复 • 430 次浏览 • 2021-09-28 16:48
关于elasticsearch 5.4版本高亮查询不生效的问题
Elasticsearch • tongchuan1992 回复了问题 • 2 人关注 • 1 个回复 • 358 次浏览 • 2021-08-22 14:51
发布一个免费的 Elasticsearch 多集群监控和管理平台 - 极限数据平台
Elasticsearch • medcl 发表了文章 • 12 个评论 • 1658 次浏览 • 2021-11-22 18:48
随着单个 Elasticsearch 集群规模的越来越大,大家要么在拆集群的路上,要么是已经是多套集群了, 据路边社消息,一个公司超过5个集群的情况已经变得非常普遍,而管理多个集群着实是有点痛苦,比如常规的玩法可能是一套集群一个 Kibana,集群一多,切换来切换去就有点懵圈了有木有?
作为一个优雅的程序员或者运维管理员,是可忍孰不可忍啊。
另外,多个集群的监控也是一个麻烦事,目前常见的几种监控如:
- 使用 Kibana 自带的监控
- 使用 Prometheus + Grafana
- 使用 Zabbix
Kibana 自带的监控可以很好的满足单个集群的监控场景,不过集群规模大了之后,经常会出现指标丢失的问题,如果使用单独的监控集群,需要修改每个节点的配置,集群都需要重启,对于已经上了生产的集群,有点不方便,另外多集群监控需要商业授权。
那 Prometheus 呢, 一个 Elasticsearch 集群如果要监控起来,首先需要部署一个 Exporter 来暴露集群指标,然后部署一套Prometheus 来采集 Elasticsearch 指标,采集完了之后再部署一套 Grafana 来进行报表分析,不同的集群要做好切换,简单的事情,搞复杂了,整个监控体系偏重,维护成本高。
Zabbix 和 Prometheus 的场景差不多,就不赘述了。
那么问题来了,有没有一个更加简单方便的多集群监控和管理方案呢,并且要支持不同版本的集群,最好是 v2、v5、v6、v7 以及最新的 v8 都能统统接管,哈哈,没错了,这里给大家介绍一个我们极限实验室团队最近开发出来的一款免费的多集群监控和管理工具-极限数据平台,目前版本 v0.1,新鲜出炉。
废话不多少,咱们直接看图说话:
首先是多集群的纳管,目前从 1.0 到最新的 8.0 统统都可以接进来。
然后就是集群的监控拉,要多简单有多简单,就是一个开关的事情,注册集群的时候,启用即开启监控,目标集群啥都不用动,费那劲干啥。
监控界面如图:
集群概览,总体情况一目了然。
各个节点信息,分门别类。
各个索引级别的信息,挨个查看。
多个集群之间的监控查看一键切换,非常方便。
查看监控的时候,发现不对劲,要操作一下集群,直接调出控制台,如下图:
常用的操作命令,可以保存起来,方便下次使用。
别再保存在记事本里面了,下次又找不到,直接加载执行就好了。
好了,你要是用 Elasticsearch 不知道这个工具,那就 out 了,赶快耍起来吧。
下载地址:
https://release.www.ksh17j.com/console/snapshot/
安装巨简单,简直懒得说,一个二进制可执行文件,一个 yml 配置文件,里面修改 Elasticsearch 地址,结束。
可以在这里查看
最后,欢迎关注极限实验室,获取更多 Elasticsearch 免费工具及业界资讯的第一手消息。
Elastic 中国开发者大会 2021 开启了,预热铁粉票已开抢,手慢无!
活动 • liaosy 发表了文章 • 0 个评论 • 343 次浏览 • 2021-11-11 17:45
【杭州站】Elastic & 阿里云 Meetup 6月5号
活动 • liaosy 发表了文章 • 0 个评论 • 853 次浏览 • 2021-05-22 17:38
活动介绍
本次Meetup杭州站由阿里云和Elastic联合举办,邀请来自滴滴、安恒信息、阿里云的资深技术专家探讨在搜索、安全、内核优化等方向的实践与创新,以及发布由数十位优秀技术开发者共创而成的实战指南,共同分享 Elasticsearch技术大咖的一线经验与深度思考。
报名方式
链接:
扫码:
活动时间
2021年06月05日 13:00-17:30
活动地址
浙江省杭州市余杭区阿里巴巴西溪园区访客中心 206-S越秀书院
活动流程
13:00~13:15 签到入座
13:15~13:30 开发者共创书籍《Elastic Stack 实战手册V1.0》发布
13:30~14:30 滴滴Elasticsearch内核优化之路
韩宝君 滴滴Elasticsearch资深开发工程师/ES社区Contributor
14:30~15:30 Elasticsearch在SIEM的应用与实践
汤乐奇 安恒信息AiLPHA大数据资深研发经理
15:30~16:30 Elasticsearch Serverless 云原生时代的创新实践
马华标(城破) 阿里巴巴高级技术专家/阿里云ES内核研发负责人
16:30~17:20 圆桌交流
17:20~17:30 抽奖合影
活动奖品
阿里云双肩包、T恤、Elastic定制礼物
阿里云ACE
阿里云ACE即全称 Alibaba Cloud Engineer,是意为阿里云的工程师、代表着云计算的建设者。同时“ACE”又是扑克牌中的“A”,因此阿里云ACE也寓意着是云计算领域王牌的一群人。在线上,ACE拥有专属的页面和29个社群,承载论坛及专栏等内容; 在线下,ACE通过组织丰富的活动,包括技术沙龙、TechDay、Meetup、官方互动等来形成本地化的开发者的学习、社交平台。
通过ACE组织的各种活动,ACE用户可以结识本地的开发者,收获前沿知识,积累行业经验,并加深对阿里云的了解。
活动交流及杭州ACE同城会钉群
活动海报
2021 Elastic 足球社区深圳线下 Meetup 重磅重启,讲师招募进行中!
活动 • howardhuang 发表了文章 • 0 个评论 • 847 次浏览 • 2021-05-21 15:49
《腾讯Elasticsearch海量规模背后的内核优化剖析》答疑
Elasticsearch • howardhuang 发表了文章 • 37 个评论 • 5096 次浏览 • 2020-05-09 17:05
今天下午的《腾讯Elasticsearch海量规模背后的内核优化剖析》分享 大家反映强烈,由于时间关系,大家的问题没能及时答复,这里集中解答,大家如果还有其它疑问也可以持续提问。感谢大家的关注! 另外腾讯云上有内核增强版的ES服务,包含了我们所有的内核优化项,欢迎大家体验! 团队也在持续招聘,欢迎简历来砸:[email protected]; [email protected]
今天下午的《腾讯Elasticsearch海量规模背后的内核优化剖析》分享 大家反映强烈,由于时间关系,大家的问题没能及时答复,这里集中解答,大家如果还有其它疑问也可以持续提问。感谢大家的关注! 另外腾讯云上有内核增强版的ES服务,包含了我们所有的内核优化项,欢迎大家体验! 团队也在持续招聘,欢迎简历来砸:[email protected]; [email protected]
【深圳ES Meetup】李猛:DB与ES结合,是业务系统实践值得探讨的事
活动 • nodexy 发表了文章 • 2 个评论 • 3477 次浏览 • 2019-11-09 17:41
【线下活动-分享主题征集-武汉】 2019年3月 Elastic&尚德机构技术沙龙
活动 • medcl 回复了问题 • 3 人关注 • 1 个回复 • 3896 次浏览 • 2019-02-22 15:42
match_phrase_prefix返回结果如何使越靠前的单词占有的权重越高,排序更靠前
回复Elasticsearch • xiaowuge 回复了问题 • 4 人关注 • 2 个回复 • 162 次浏览 • 5 天前
是否存在Solr query URL到ES query DSL工具?
回复Elasticsearch • printlove 回复了问题 • 2 人关注 • 1 个回复 • 944 次浏览 • 6 天前
es的统计监控里观察到 index的次数和get的次数对不上
回复Elasticsearch • code4j 发起了问题 • 1 人关注 • 0 个回复 • 152 次浏览 • 2021-12-02 15:02
cat/indices 查看有nested对象的index文档数量有延迟
回复Elasticsearch • Charele 回复了问题 • 2 人关注 • 1 个回复 • 166 次浏览 • 2021-10-22 16:35
关于elasticsearch 5.4版本高亮查询不生效的问题
回复Elasticsearch • tongchuan1992 回复了问题 • 2 人关注 • 1 个回复 • 358 次浏览 • 2021-08-22 14:51
ElasticSearch查询的语句怎么对聚合过滤分组
回复Elasticsearch • Rewardingggg 发起了问题 • 2 人关注 • 0 个回复 • 506 次浏览 • 2021-08-08 23:35
ElasticSearch 同一个query查询响应时间差异大?
回复Elasticsearch • zmc 回复了问题 • 4 人关注 • 4 个回复 • 1377 次浏览 • 2021-07-21 19:33
Es Filelddata 占用6G的jvm堆内存 ,_cache/clear清理后,马上又占用了6G,频繁full gc
回复Elasticsearch • zqc0512 回复了问题 • 4 人关注 • 3 个回复 • 929 次浏览 • 2021-07-15 09:35
elasticsearch query与agg分开是否可以提高性能?
回复Elasticsearch • tongchuan1992 回复了问题 • 2 人关注 • 1 个回复 • 595 次浏览 • 2021-07-08 09:24
发布一个免费的 Elasticsearch 多集群监控和管理平台 - 极限数据平台
Elasticsearch • medcl 发表了文章 • 12 个评论 • 1658 次浏览 • 2021-11-22 18:48
随着单个 Elasticsearch 集群规模的越来越大,大家要么在拆集群的路上,要么是已经是多套集群了, 据路边社消息,一个公司超过5个集群的情况已经变得非常普遍,而管理多个集群着实是有点痛苦,比如常规的玩法可能是一套集群一个 Kibana,集群一多,切换来切换去就有点懵圈了有木有?
作为一个优雅的程序员或者运维管理员,是可忍孰不可忍啊。
另外,多个集群的监控也是一个麻烦事,目前常见的几种监控如:
- 使用 Kibana 自带的监控
- 使用 Prometheus + Grafana
- 使用 Zabbix
Kibana 自带的监控可以很好的满足单个集群的监控场景,不过集群规模大了之后,经常会出现指标丢失的问题,如果使用单独的监控集群,需要修改每个节点的配置,集群都需要重启,对于已经上了生产的集群,有点不方便,另外多集群监控需要商业授权。
那 Prometheus 呢, 一个 Elasticsearch 集群如果要监控起来,首先需要部署一个 Exporter 来暴露集群指标,然后部署一套Prometheus 来采集 Elasticsearch 指标,采集完了之后再部署一套 Grafana 来进行报表分析,不同的集群要做好切换,简单的事情,搞复杂了,整个监控体系偏重,维护成本高。
Zabbix 和 Prometheus 的场景差不多,就不赘述了。
那么问题来了,有没有一个更加简单方便的多集群监控和管理方案呢,并且要支持不同版本的集群,最好是 v2、v5、v6、v7 以及最新的 v8 都能统统接管,哈哈,没错了,这里给大家介绍一个我们极限实验室团队最近开发出来的一款免费的多集群监控和管理工具-极限数据平台,目前版本 v0.1,新鲜出炉。
废话不多少,咱们直接看图说话:
首先是多集群的纳管,目前从 1.0 到最新的 8.0 统统都可以接进来。
然后就是集群的监控拉,要多简单有多简单,就是一个开关的事情,注册集群的时候,启用即开启监控,目标集群啥都不用动,费那劲干啥。
监控界面如图:
集群概览,总体情况一目了然。
各个节点信息,分门别类。
各个索引级别的信息,挨个查看。
多个集群之间的监控查看一键切换,非常方便。
查看监控的时候,发现不对劲,要操作一下集群,直接调出控制台,如下图:
常用的操作命令,可以保存起来,方便下次使用。
别再保存在记事本里面了,下次又找不到,直接加载执行就好了。
好了,你要是用 Elasticsearch 不知道这个工具,那就 out 了,赶快耍起来吧。
下载地址:
https://release.www.ksh17j.com/console/snapshot/
安装巨简单,简直懒得说,一个二进制可执行文件,一个 yml 配置文件,里面修改 Elasticsearch 地址,结束。
可以在这里查看
最后,欢迎关注极限实验室,获取更多 Elasticsearch 免费工具及业界资讯的第一手消息。
极限网关入门视频教程已发布
Elasticsearch • medcl 发表了文章 • 4 个评论 • 242 次浏览 • 2021-11-21 11:41
Elastic 中国开发者大会 2021 开启了,预热铁粉票已开抢,手慢无!
活动 • liaosy 发表了文章 • 0 个评论 • 343 次浏览 • 2021-11-11 17:45
给Zblogphp插上Elasticsearch的翅膀
Elasticsearch • 森 发表了文章 • 0 个评论 • 325 次浏览 • 2021-10-11 23:00
通过python脚本迁移ES的template模板
Elasticsearch • 森 发表了文章 • 0 个评论 • 320 次浏览 • 2021-09-30 09:30
通过python脚本迁移ES的template模板
通过python脚本迁移ES的template模板,从192.168.0.1 迁移到 192.168.0.2
import base64
import json
import requests
def putTemplate(templateName, templateDslJson):
print("{0} 索引模板正在迁移中".format(templateName))
res = requests.put("https://192.168.0.2:9200/_template/{0}".format(templateName), json=templateDslJson)
print(res.status_code)
print(res.content)
def getTemplateDslJson():
username = "elastic"
password = "123456"
user_info_str = username + ":" + password
user_info = base64.b64encode(user_info_str.encode()) # 这个得到是个字节类型的数据
headers = {
"Authorization": "Basic {0}".format(user_info.decode()) # 这个就是需要验证的信息
}
url = "https://192.168.0.1:9200/_template/*_template"
res = requests.get(url, headers=headers)
print(res.status_code)
return json.loads(res.content)
if __name__ == '__main__':
jsonTemplate = getTemplateDslJson()
if isinstance(jsonTemplate, dict):
for templateName in jsonTemplate:
templateDslJson = jsonTemplate[templateName]
putTemplate(templateName, templateDslJson)
Elastic日报 第1272期 (2021-07-08)
Elastic日报 • BKing 发表了文章 • 0 个评论 • 425 次浏览 • 2021-07-08 20:18
【杭州站】Elastic & 阿里云 Meetup 6月5号
活动 • liaosy 发表了文章 • 0 个评论 • 853 次浏览 • 2021-05-22 17:38
活动介绍
本次Meetup杭州站由阿里云和Elastic联合举办,邀请来自滴滴、安恒信息、阿里云的资深技术专家探讨在搜索、安全、内核优化等方向的实践与创新,以及发布由数十位优秀技术开发者共创而成的实战指南,共同分享 Elasticsearch技术大咖的一线经验与深度思考。
报名方式
链接:
扫码:
活动时间
2021年06月05日 13:00-17:30
活动地址
浙江省杭州市余杭区阿里巴巴西溪园区访客中心 206-S越秀书院
活动流程
13:00~13:15 签到入座
13:15~13:30 开发者共创书籍《Elastic Stack 实战手册V1.0》发布
13:30~14:30 滴滴Elasticsearch内核优化之路
韩宝君 滴滴Elasticsearch资深开发工程师/ES社区Contributor
14:30~15:30 Elasticsearch在SIEM的应用与实践
汤乐奇 安恒信息AiLPHA大数据资深研发经理
15:30~16:30 Elasticsearch Serverless 云原生时代的创新实践
马华标(城破) 阿里巴巴高级技术专家/阿里云ES内核研发负责人
16:30~17:20 圆桌交流
17:20~17:30 抽奖合影
活动奖品
阿里云双肩包、T恤、Elastic定制礼物
阿里云ACE
阿里云ACE即全称 Alibaba Cloud Engineer,是意为阿里云的工程师、代表着云计算的建设者。同时“ACE”又是扑克牌中的“A”,因此阿里云ACE也寓意着是云计算领域王牌的一群人。在线上,ACE拥有专属的页面和29个社群,承载论坛及专栏等内容; 在线下,ACE通过组织丰富的活动,包括技术沙龙、TechDay、Meetup、官方互动等来形成本地化的开发者的学习、社交平台。
通过ACE组织的各种活动,ACE用户可以结识本地的开发者,收获前沿知识,积累行业经验,并加深对阿里云的了解。
活动交流及杭州ACE同城会钉群
活动海报
2021 Elastic 足球社区深圳线下 Meetup 重磅重启,讲师招募进行中!
活动 • howardhuang 发表了文章 • 0 个评论 • 847 次浏览 • 2021-05-21 15:49
ES 7.4.2的Sort Script查询性能比较差
Elasticsearch • quan子里的世界 发表了文章 • 0 个评论 • 1535 次浏览 • 2021-01-19 14:15
我们的es从5.3.2升级到7.4.1,遇到一个脚本的性能问题。同样的一段Sort Script脚本, 在ES 7.4.1的执行要比ES 5.3.2要慢至少一倍。一个主要的特点就是departure_city_ids可能会很多,通过doc获取一个deparature_city_ids的数据, 数据的大小最大的时候达到两千多个左右。Type为keyword类型。
- 具体的sort script脚本实例已经贴在下面了。
脚本实例:
"sort": [
{
"_script": {
"script": {
"inline": "return doc['departure_city_ids'].size()",
"lang": "painless"
},
"type": "number",
"order": "desc"
}
}
]
极限网关 INFINI Gateway 初体验
Elasticsearch • liaosy 发表了文章 • 3 个评论 • 3554 次浏览 • 2020-12-09 00:57
#切换该路径下(路径自定)
cd /Users/shiyang/code/elastic/gateway
#下载
wget
#下载完后解压
tar -zxvf GATEWAY-darwin64.tar.gz
#解压后能看到两个新文件,一个可执行二进制文件,一个yml配置文件
ls
#gateway-darwin64 gateway.yml
安装部署
在run之前需要先运行elastisearch,否则会报错,如图所示:
接下来先启动es集群(如果你本地还没有部署es,建议先参考官网的下载部署)
本机用的es版本为7.9.0,如下图表示启动es成功:
接下来再启动gateway,yml配置文件可以先默认,后续可根据需要再修改。#启动
./gateway-darwin64
启动成功如下图所示:
成功启动后,我们就可以直接访问gateway了。curl
到此,gateway就算本地部署完毕了。
是不是很简单?嗯,下载即使用,简单方便。
(接下来可以试用一下gateway的特性了。将发布在下一篇文章。) Elasticsearch索引拆分方案
Elasticsearch • 森 发表了文章 • 0 个评论 • 4406 次浏览 • 2020-10-19 09:08
Elasticsearch索引拆分方案
[TOC]
一、概况
项目中,由于Elasticsearch单个索引数据量大,索引中部分数据不常用,在搜索和写入文档时,效率较低。为了减小单个索引的数据量,提升搜索和文档写入效率,将大索引根据一定的规则拆分为小的索引。拆分索引的关键点在于建立索引,文档同步,多索引搜索。
建立索引的关键问题是索引的设置以及字段的属性设置,最常见的问题是,某个字段我们希望Elasticsearch 按照我们的想法进行分词。采用自动生成索引(默认模板),索引字段的类型就会根据第一条文档的数据进行字段转换,无法实现具体某个字段使用我们想要的分词方式。另外就是无法使用自定义分词器,索引的默认分片数为5,无法根据我们制定的分片数进行分配。
为了实现我们这种自动创建索引的特殊要求,Elasticsearch也提供了索引模板API。
索引模板,就是创建索引的模板,模板中包含公共的配置(Settings)和映射(Mappings),并包含一个简单触发条件,及条件满足时使用该模板创建一个新的索引。
模板只在创建索引时应用。更改模板不会对现有索引产生影响。当使用create index API时,作为create index调用的一部分定义的设置/映射将优先于模板中定义的任何匹配设置/映射。
文档同步和搜索,我们都采用了别名的形式。索引别名,就像一个快捷方式或软连接,可以指向一个或多个索引,也可以给任何一个需要索引名的API来使用,别名不能与索引具有相同的名称。别名带给我们极大的灵活性,允许我们在运行的集群中可以无缝的从一个索引切换到另一个索引,给多个索引分组 ,给索引的一个子集创建。因为使用别名,你的应用可以在零停机的情况下从旧索引迁移到新索引。
由于文档同步,必须指定一个唯一的索引才能成功。原来单索引时,我们的索引采取了 “索引名称_v1”的形式,为方便在零停机的情况下重建索引,文档更新也新建了一个专门的索引别名。 拆分索引后,索引名称规范为“索引名称_YYMM”按月拆分(包括但不限于此种方式),就会出现多个索引,此时就不在方便新增专门的索引别名用于文档更新,反而用索引名字直接进行文档更新,就会更加的方便,直接和准确。
文档同步使用索引名称,搜索依旧使用别名的形式。多个索引,有相同的别名,索引拆分,文档分属不同的索引,但因为有相同的别名,使用别名搜索时,依然可以将数据搜索出来。
通过建立索引,文档同步,多索引搜索实现了单索引到多索引的拆分。数据还是那些数据,依然能搜索出来,索引数变多了,每个索引的数据减少,同步文档速度就可以提高。搜索也可以根据业务需求只查询部分索引,提升了查询速度,也可以查询所有数据,根据实际场景可自由变换。
二、索引拆分规则
索引拆分,可以根据创建时间拆分,如:”索引名称_yyyyMM“,”索引名称_yyyy“;也可以根据主键ID求余的方式来进行拆分,如:”索引名称_0“,”索引名称_1“。
具体的拆分规则根据业务需要进行,需要注意的是,无论根据创建时间还是根据主键ID求余来拆分,都要求根据拆分的值,是文档中不变的值,才能唯一确定一个索引,进行文档的存储,如:主键ID,创建时间;不可为变化的值,有可能变化的值,就无法唯一确定一个索引进行文档存储,如:状态,那就会出现当前在这个索引,状态改变后再另外的索引,这样每个索引都有同一条状态不同的数据,搜索时就会不准确。
本文将根据创建时间进行索引拆分。
思路:
- 创建索引模板
- 同步文档时,选用的索引名称以"索引名称_yyyyMM"命名,自动创建带别名的索引
- 如果文档同步到新索引,原索引中的文档需删除
三、创建索引模板
以商品评论索引为例,将单索引拆分为多索引,根据以下规则,在同步文档时,如果无索引会字段根据模板生成:
- 索引名称的规则“goods_comment_202010”
- 索引别名为“goods_comment”
- number_of_shards分片数为3
- 配置Settings
- 定义Mappings字段及其类型
具体模板如下所示:
{
"order" : 0,
"index_patterns" : [
"goods_comment*"
],
"settings" : {
"index" : {
"max_result_window" : "100000",
"analysis" : {
"filter" : {
"by_stop_filter" : {
"type" : "stop",
"stopwords" : [
" "
]
},
"pinyin_first_letter_and_full_pinyin_filter" : {
"keep_none_chinese_in_first_letter" : "true",
"lowercase" : "true",
"keep_original" : "true",
"keep_first_letter" : "true",
"trim_whitespace" : "true",
"type" : "pinyin",
"keep_none_chinese" : "true",
"limit_first_letter_length" : "16",
"keep_full_pinyin" : "true"
},
"by_synonym_filter" : {
"type" : "synonym",
"synonyms_path" : "analysis/synonym.txt"
},
"full_pinyin_filter" : {
"keep_none_chinese_in_first_letter" : "true",
"lowercase" : "true",
"keep_original" : "true",
"keep_first_letter" : "false",
"trim_whitespace" : "true",
"type" : "pinyin",
"keep_none_chinese" : "true",
"limit_first_letter_length" : "16",
"keep_full_pinyin" : "true"
}
},
"char_filter" : {
"by_char_filter" : {
"type" : "mapping",
"mappings" : [
"| => |"
]
}
},
"analyzer" : {
"by_max_word" : {
"filter" : [
"by_synonym_filter",
"lowercase"
],
"char_filter" : [
"html_strip"
],
"type" : "custom",
"tokenizer" : "ik_max_word"
}
},
"tokenizer" : {
"my_pinyin" : {
"lowercase" : "true",
"keep_original" : "true",
"remove_duplicated_term" : "true",
"keep_separate_first_letter" : "false",
"type" : "pinyin",
"limit_first_letter_length" : "16",
"keep_full_pinyin" : "true"
}
}
},
"number_of_shards" : "3",
"number_of_replicas" : "1"
}
},
"mappings" : {
"_doc" : {
"properties" : {
"is_img" : {
"type" : "integer"
},
"gid" : {
"type" : "integer"
},
"pubtime" : {
"type" : "integer"
}
....
}
}
},
"aliases" : {
"goods_comment" : { }
}
}
上述模板定义,看似复杂,拆分来看,主要为如下几个部分:
{
"order": 0, // 模板优先级
"index_patterns": ["goods_comment*"],// 模板匹配的名称方式
"settings": {...}, // 索引设置
"mappings": {...}, // 索引中各字段的映射定义
"aliases": {...} // 索引的别名
}
3.1 模板优先级
有时候,一个模板可能绝大部分符合新建索引的需求,但是局部需要微调,此时,如果复制旧的模板,修改该模板后,成为一个新的索引模板即可达到我们的需求,但是这操作略显重复。此时,可以采用模板叠加与覆盖来操作。模板的优先级是通过模板中的 order 字段定义的,数字越大,优先级越高。 如下为定义所有以 te 开头的索引的模板:
{
"order": 0,
"index_patterns": "te*",
"settings": {
"number_of_shards": 1
},
"mappings": {
"type1": {
"_source": {
"enabled": false
}
}
}
}
索引模板是有序合并的。如何想单独修改某一小类索引的一两处单独设置,可以在累加一层模板。
{
"order": 1,
"index_patterns": "tete*",
"settings": {
"number_of_shards": 2
},
"mappings": {
"type1": {
"_all": {
"enabled": false
}
}
}
}
上述第一个模板的 order 为0,第二个模板的 order 为1,优先级高于第一个模板,其会覆盖第一个模板中的相同项。所以对于所有以 tete 开头的索引模板效果如下:
{
"settings": {
"number_of_shards": 2
},
"mappings": {
"type1": {
"_source": {
"enabled": false
},
"_all": {
"enabled": false
}
}
}
}
两个模板叠加了,项目的字段,优先级高的覆盖了优先级低的,如分片数。
3.2 模板匹配的名称
索引模板中的 "index_patterns" 字段定义的是该索引模板所应用的索引情况。如 "index_patterns": "tete*" 所表示的含义是,当新建索引时,所有以 tete 开头的索引都会自动匹配到该索引模板。利用该模板进行相应的设置和字段添加等。
3.3 settings 部分
索引模板中的 settings 部分一般定义的是索引的主分片、拷贝分片、刷新时间、自定义分析器等。常见的 settings 部分结构如下:
"settings": {
"index": {
"analysis": {...}, // 自定义的分析器
"number_of_shards": "32", // 主分片的个数
"number_of_replicas": "1", // 主分片的拷贝分片个数
"refresh_interval": "5s" // 刷新时间
}
}
建立的索引,不会立马查到,这是为什么 Elasticsearch 为 near-real-time(接近实时)的原因,需要配置刷新时间,默认的是 1s。settings 的设置中,重点是自定义分析器的设置。
-
分析器是三个顺序执行的组件的结合。他们分别是字符过滤器、分词器、标记过滤器。字符过滤器是让字符串在被分词前变得更加整洁。一个分析器可能包含零到多个字符过滤器(character_filter)。
-
分词器将字符串分割成单独的词(terms)或标记(tokens)。一个分析器必须包含一个分词器。
- 分词器分词的结果的标记流会根据各自的情况,传递给特定的标记过滤器。标记过滤器可能修改、添加或删除标记。
创建的创建自定义分析器结构如下:
"settings": {
"index": {
"analysis": {
"char_filter": { ... }, // 用户自定义字符过滤器
"tokenizer": { ... }, // 用户自定义分词器
"filter": { ... }, // 用户自定义标记过滤器
"analyzer": { ... } // 用户自定义分析器
},
...
}
}
3.4 索引类型的字段映射
索引模板中,映射字段所对应的常用结构是:
"mappings": {
"_doc": { // 索引下的类型 _doc 应用该映射
"dynamic_templates": [ ... ], // 动态映射部分,用于未定义的 my_type 下字段
"properties": { ... } // 自定义字段的响应映射
}
}
"_doc" 是索引下的一个类型,Elasticsearch 7.x仅支持"_doc"作为索引类型,Elasticsearch 6.x推荐使用"_doc"为索引类型。
动态映射
动态映射 "dynamic_templates" 字段对应的是一个数组,数组中的元素是一个个字段的映射模板。每个字段的映射模板都有一个名字用户描述这个模板的用途,一个 mapping 字段由于指明这个映射如何使用,和至少一个参数(例如 match)来定义这个模板适用于哪个字段。 dynamic_templates 字段对应的字段模板结构如下:
{
"string_fields": { // 字段映射模板的名称,一般为"类型_fields"的命名方式
"match": "*", // 匹配的字段名为所有
"match_mapping_type": "string", // 限制匹配的字段类型,只能是 string 类型
"mapping": { ... } // 字段的处理方式
}
自定义字段映射
针对索引类型中存在的字段,除了可以采用动态模板的方式,还可以采用定义定义的方式,常见的自定义结构如下:
"mappings": {
"my_type": {
"dynamic_templates": [ ... ],
"properties": {
"user_city": { // 字段名
"analyzer": "lowercase_analyzer", // 字段分析器
"index": "analyzed", // 字段索引方式定义索引
"type": "string", // 字段数据类型定义为 string
"fields": { // 定义一个名为 user_city.raw 的嵌入的不分析字段
"raw": {
"ignore_above": 512,
"index": "not_analyzed",
"type": "string"
}
}
},
"money":{
"type": "double",
"doc_values": true
}
...
}
}
}
3.5 别名
即使你认为现在的索引设计已经是完美的了,当你的应用在生产环境使用时,还是有可能在今后有一些改变的。所以请做好准备:在应用中使用别名而不是索引。然后你就可以在任何时候重建索引。别名的开销很小,应当广泛使用。利用索引别名,可以实现零停机时间重新索引。 定义方式如下:
{
"order": 0, // 模板优先级
"index_patterns": "goods_comment*", // 模板匹配的名称方式
"settings": {...}, // 索引设置
"mappings": {...}, // 索引中各字段的映射定义
"aliases": {
"goods_comment":{}
}
}
以上只是简单的介绍了索引模板和模板内的组成部分的介绍,详情请见Elasticsearch官方文档。
有了以上的知识,我们就可以利用索引模板的API,来对模板进行创建,查询,删除操作了。
3.6 索引模板管理
创建索引模板
PUT _template/goods_comment_template
{
"order": 0, // 模板优先级
"index_patterns": "goods_comment*", // 模板匹配的名称方式
"settings": {...}, // 索引设置
"mappings": {...}, // 索引中各字段的映射定义
"aliases": {
"goods_comment":{}
}
}
查看索引模板
GET _template // 查看所有模板
GET _template/temp* // 查看与通配符相匹配的模板
GET _template/temp1,temp2 // 查看多个模板
GET _template/shop_template // 查看指定模板
判断模板是否存在
HEAD _template/shop_tem
结果: a) 如果存在, 响应结果是: 200 - OK b) 如果不存在, 响应结果是: 404 - Not Found
删除索引模板
DELETE _template/shop_template // 删除上述创建的模板
如果模板不存在, 将抛出404 错误
四、同步文档,自动创建索引
前面创建了商品评论的索引模板(goods_comment_template),同步文档时,指定索引名称为“goods_comment_202010”,如果索引不存在,便会创建名为“goods_comment_202010”的索引,同时创建好“goods_comment”别名。索引的settings和mappings都会根据模板定义的规则生成好。索引创建成功,此时该索引便能正常使用啦。
商品评论业务中,同步文档是在代码中实现,需要根据商品评论的创建时间,以“goods_comment_yyyyMM”的形式获取完整的索引名称(如:goods_comment_202010),同步文档指定goods_comment_202010,即可将数据同步到该索引。
五、别名搜索
多个商品评论索引,每个索引都有“goods_comment“别名,使用别名进行搜索,便能从这多个索引中获取数据。
同理,其他业务索引实现搜索,都要求使用别名形式。
六、可能存在的问题点
索引创建后,并不是一成不变的,随着业务的发展,新增字段也是较常见的。原来单索引,新增一个字段,只需要在mappings新增字段,重建索引,迁移数据,切换别名即可。拆分后的多索引,工作量便会成被增加。
修改索引模板,只会对后续生成的索引有作用,之前生成的索引,如需调整,需要手动或者使用脚本的形式进行重建并迁移数据。
七、附录
demo演示,也是体验索引拆分的一个实现过程。
7.1 查询索引模板列表
查看ES中的所有索引模板列表
命令:
GET _cat/templates?v
结果:
name index_patterns order version
kibana_index_template:.kibana [.kibana] 0
.monitoring-kibana [.monitoring-kibana-6-*] 0 6050399
.management-beats [.management-beats] 0 67000
7.2 创建索引模板
命令:
PUT _template/demo_template
{
"order": 0,
"index_patterns": [
"demo*"
],
"settings": {
"index": {
"number_of_shards": 2,
"number_of_replicas": 0,
"max_result_window": 100000
}
},
"aliases": {
"demo": {}
}
}
结果:
{
"acknowledged" : true
}
7.3 查看索引模板详情
命令:
GET _template/demo_template
结果:
{
"demo_template" : {
"order" : 0,
"index_patterns" : [
"demo*"
],
"settings" : {
"index" : {
"max_result_window" : "100000",
"number_of_shards" : "2",
"number_of_replicas" : "0"
}
},
"mappings" : { },
"aliases" : {
"demo" : { }
}
}
}
7.4 查询索引数据
命令:
GET demo_v1/_search
结果:
{
"error" : {
"root_cause" : [
{
"type" : "index_not_found_exception",
"reason" : "no such index",
"resource.type" : "index_or_alias",
"resource.id" : "demo_v1",
"index_uuid" : "_na_",
"index" : "demo_v1"
}
],
"type" : "index_not_found_exception",
"reason" : "no such index",
"resource.type" : "index_or_alias",
"resource.id" : "demo_v1",
"index_uuid" : "_na_",
"index" : "demo_v1"
},
"status" : 404
}
7.5 创建文档
在此之前demo_v1索引不存在,通过创建文档,自动生成索引,新创建的demo_v1将根据demo_template索引模板生成。
命令:
POST demo_v1/_doc
{
"id": 1,
"title": "这是一条数据"
}
结果:
{
"_index" : "demo_v1",
"_type" : "_doc",
"_id" : "20upIHUBO6Fj2CIJUFPr",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
查看数据
GET demo_v1/_search 用索引名称进行查询
GET demo/_search 用别名进行查询
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "demo_v1",
"_type" : "_doc",
"_id" : "20upIHUBO6Fj2CIJUFPr",
"_score" : 1.0,
"_source" : {
"id" : 1,
"title" : "这是一条数据"
}
}
]
}
}
发现使用索引名称和别名都能搜索出来。但是我们并未单独创建索引别名。我们来查看一下demo_v1索引的结构。
GET demo_v1
{
"demo_v1" : {
"aliases" : {
"demo" : { }
},
"mappings" : {
"_doc" : {
"properties" : {
"id" : {
"type" : "long"
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "2",
"provided_name" : "demo_v1",
"max_result_window" : "100000",
"creation_date" : "1602570768526",
"number_of_replicas" : "0",
"uuid" : "WrXtDB5eRzmU-xX1vAUCrA",
"version" : {
"created" : "6070099"
}
}
}
}
}
我们可以看到,demo_v1 索引中的数据:
- 分片数(number_of_shards): 2
- 副本(number_of_replicas): 0
- 别名(aliases):demo
- 最大结果窗口(max_result_window):100000
这些都是我们在demo_template模板中设置的,在自动创建索引时,根据索引模板的index_patterns值,只要我们的索引名称是以“demo”为前缀,都会根据该模板生成索引。因此,无论是demo_v1,还是demo_v2,只要是以“demo”为前缀,直接创建文档,如果不存在索引,ES也会自动给我们创建以“demo_template”为模板的索引。实现索引拆分最关键的点,就在于索引模板。
同样,我们通过创建文档,来生成一个没有索引模板的索引进行对比。
查询demo
GET demo/_search
确定demo索引不存在
{
"error" : {
"root_cause" : [
{
"type" : "index_not_found_exception",
"reason" : "no such index",
"resource.type" : "index_or_alias",
"resource.id" : "demo",
"index_uuid" : "_na_",
"index" : "demo"
}
],
"type" : "index_not_found_exception",
"reason" : "no such index",
"resource.type" : "index_or_alias",
"resource.id" : "demo",
"index_uuid" : "_na_",
"index" : "demo"
},
"status" : 404
}
创建一条文档
POST demo/_doc
{
"id": 1,
"title": "这是一条数据"
}
创建成功
{
"_index" : "demo",
"_type" : "_doc",
"_id" : "PmXEIHUBwM4PCvJbG7Xw",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
查看数据
GET demo/_search
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "demo",
"_type" : "_doc",
"_id" : "PmXEIHUBwM4PCvJbG7Xw",
"_score" : 1.0,
"_source" : {
"id" : 1,
"title" : "这是一条数据"
}
}
]
}
}
数据同步成功,索引也因此创建完成,我们来看看这个索引结构
GET demo
{
"demo" : {
"aliases" : { },
"mappings" : {
"_doc" : {
"properties" : {
"id" : {
"type" : "long"
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "2",
"provided_name" : "demo",
"creation_date" : "1602572524390",
"number_of_replicas" : "1",
"uuid" : "p8kNddGzQzWOaz5xLcSWhA",
"version" : {
"created" : "6070099"
}
}
}
}
}
我们可以看到,demo索引中的数据:
- 分片数(number_of_shards): 2
- 副本(number_of_replicas): 1
- 别名(aliases):无
- 最大结果窗口(max_result_window):无
为了直观比较,请看下表:
有索引模板(demo_v1) | 无索引模板(demo) | |
---|---|---|
number_of_shards | 2 | 2 |
number_of_replicas | 0 | 1 |
aliases | demo | 无 |
max_result_window | 10w | 无,默认是1w |
上表可知,通过索引模板的创建的索引,有利于我们更好的掌控索引的结构。
通过demo演示,我们可以进一步的理解索引拆分的一个过程及其实现原理,重点在索引模板。
八、参考
训练营报名中 | 5天突破Elasticsearch全观测日志分析能力
Elasticsearch • zengcici 发表了文章 • 0 个评论 • 1145 次浏览 • 2020-09-08 11:43
报名时间:截止 2020年9月13日 23:59分 报名链接:
训练营介绍
奖品介绍
云栖大会 | Elasticsearch 场景化应用专场,将于2020年9月18日 下午13:00开始,如果你不想错过,马上订阅吧
更多Elasticsearch 场景化应用,请下载白皮书【Elasticsearch 八大经典应用】 下载链接:
1.ES之从零开始 | 搜索建议 - 简介
Elasticsearch • Ricky_Lau 发表了文章 • 0 个评论 • 2946 次浏览 • 2020-07-22 18:59
1.ES之从零开始 | 搜索建议 - 简介
自从个人博客数据意外丢失后,已经有一年没写过博客了。 觉得地下有点凉,是时候爬起来了,所以就有了这个系列的分享。
为什么要用搜索建议 ?
通过两个小例子,了解搜索建议主要功能:纠错(Did You Mean)和补全(Auto-complete).
- 手残党,有些时间在输入比较长的英文单词的时候总会有缺胳膊少腿的问题,是否可以通过技术来解决这类问题提升用户的体验?
- 公司里业务开发对Elasticsearch的query DSL 不是特别熟悉,若是纯手写,基本是无法完成正确查询语法的编写
,但如果使用kibna却是可以写出正确的查询的。
相信通过上面两个例子,都了解了搜索建议的两个主要功能纠错和补全,为什么要使用也就迎刃而解了。 接下来,主要从技术和落地的维度来聊一聊搜索建议。
搜索建议的技术架构
- 纠错(Did You Mean)
- 用户在搜索框中输入有问题的词,elastisearch(少了个字母c )
- 由于少了个字母,倒排表里未找到相应的文档,所以返回的命中结果为0.
- 因为命中0结果,发送一个纠错请求,希望通过增加、删除、替换一个字符来取得一个系统里存在的词。
- 把纠错后的词发送到客户端
- 获取系统中存在的,最可能的纠错词。
- 选择正确的纠错词发送查询请求
- 返回希望的检索结果。
- 补全(Auto-Complete)
- 用户输入第一个字符
- 异步发送第一个字符尝试进行前缀补全
- 返回前缀被全词, 相同前缀的根据权重排序返回
- 选择下拉正确的补全词
- 根据正确的词,发送检索请求
- 返回期望的查询结果。
小结
- 纠错可以解决小范围输错的问题,增加容错率来提升用户体验。
- 补全,可以有效的减少用户输入,提升搜索的准确率。
总结最近半年对Elasticsearch开源项目的贡献
Elasticsearch • bellengao 发表了文章 • 2 个评论 • 2390 次浏览 • 2020-06-22 10:07
自从2019年对Elasticsearch项目提交过一次代码之后,开始逐渐关注社区里的新动态,并且尝试去解决一些issue,通过这个过程去理解源码从而可以深入理解Elasticsearch的实现机制。现在把最近半年(2020年1月-2020年6月)对Elasticsearch项目所做的工作进行一次总结,记录遇到的问题和解决办法。
ingest set processor增加ignore_empty_value参数
issue:
PR:
使用ingest set processor时, 如果对于value字段为空字符串或者null的情况不需要进行处理,当前只能通过脚本判断value是否为空字符串或者null。本次提交对set processor增加了ignore_empty_value参数,设置该参数为true后,set processor会自动规避value字段为空字符串或者null的情况, 不对文档进行任何修改,优雅的退出处理逻辑。
修复reindex api bug
issue:
PR:
调用reindex api,当max_docs参数<slices时,会报错max_docs为0,实际上是因为没有提前校验max_docs是否<slices,导致max_docs被设置为0。本次提交修复了这个bug,并且给出比较清晰的错误提示。
当使用date_nanos字段作为过滤条件并且使用now时,无法创建filtered alias
issue:
PR:
PUT date_source/_alias/date_nanos_alias
{
"filter": {
"range": {
"date_nanos": {
"gt": "now-7d/d"
}
}
}
}
如上述操作,创建filtered alias时,以date_nanos字段为过滤条件,并且使用了now,会导致创建别名失败;该提交主要是修改了queryShardContext中的nowInMillis值,设置为当前时间戳。
禁止修改nested字段的include_in_root、include_in_parent参数
issue:
PR:
nested字段的include_in_root、include_in_parent参数,是无法进行修改的,但是当前调用PUT {index}/_mapping API进行修改时却没有报错,本次提交的改动是在修改两个参数时抛出400参数错误。
对所有处理字符串类型数据的ingest processor,支持字段值为数组
issue:
PR:
对Lowercase Processors、Uppercase Processors、Trim Processors等处理字符串类型数据的ingest processor, 都支持要处理的字段类型为数组类型。
修复_search/template API返回结果总量不准的bug
issue:
PR:
调用GET _search/template API时,如果设置了rest_total_hits_as_int为true,处理逻辑应该和GET _search API一致,trackTotalHitsUpTo变量会被设置为Integer.MAX_VALUE,因此都能够获取到准确的total hits count。但是在_search/template API的处理逻辑中,虽然rest_total_hits_as_int设置为了true, trackTotalHitsUpTo值却没有被设置,因此只能获取到最多为10000的total hits。
修复ingest pipeline simulate API异常处理bug
issue:
PR:
调用POST _ingest/pipeline/_simulate API时,如果传入的docs参数是空列表,则什么结果都不会返回。 Bug产生的原因是,在异步请求的ActionListener中没有对docs参数进行判空,导致始终没有响应给客户端。
修复删除enrich policy时的bug
issue:
PR:
enrich policy关联的索引名称的格式为[policy_name]-*,在调用删除enrich policy的API:DELETE /_enrich/policy/action.destructive_requires_name
参数为true,则删除enrich policy会报错‘Wildcard expressions or all indices are not allowed’. 本次提交的改动是不直接通过通配符删除索引,获取到所有的索引名称后进行批量删除。
当因磁盘写满而导致ES自动对索引设置read_only_allow_delete block时,对http请求返回429状态码而不是403
issue:
PR:
这个提交有意思了,耗时也非常久,中间经过数次代码调整与优化。这个改动的初衷是因为在磁盘写满的情况下,ES会自动地把对应节点上的索引设置为只读(index.read_only_allow_delete=true), 后续有新的写入请求进来后,会直接返回403状态码拒绝进行写入。实际上,ES对所有类型的block,对应的http状态码都设置为403, 这就会导致一个问题,在部分客户端比如rest client碰到403的状态码,是不会对写入请求进行重试的,直接丢弃掉请求,导致数据丢失。所以该提交就需要针对因为index.read_only_allow_delete为true的情况,返回429状态码(429意思是TOO_MANY_REQUESTS, 请求太多,需要限流)。在提交代码之后,和社区的maintainer针对单元测试代码经过数次讨论,最终才被合并进master分支。讨论的焦点在于,6.8版本之后,如果磁盘空间释放出来,索引的只读的状态会被自动的release,有单独的线程轮询检查磁盘来确定要不要释放只读状态,所以需要对auto release机制是否开启进行随机选择。一方面,auto release开启,因为客户端接收到429状态码,写入请求经过重试后能够成功执行;另一方面,关闭auto release, 写入请求经过数次重试后仍然执行失败而报错。
elasticsearch-croneval工具异常捕获
issue:
PR:
elasticsearch-croneval工具是一个社区提供的用于校验cron表达式是否正确的一个工具,放置在elasticsearch安装目录的bin目录下。该工具的执行实际上调用了项目中的CronEvalTool类的main方法,实际上在执行的过程中,因为没有正确地捕获异常,导致在对非法的cron表达式进行校验时,工具直接把整个stacktrace信息都打印出来了。针对这个issue所做的提交捕获了这个异常,并给出了较为简明的错误信息。第一次提交之后,项目的maintainer表示要对这个改动进行team-discuss, 最终讨论下来的结果是:对该工具增加一个默认关闭的命令行参数,如果用户有需要查看完整的异常信息,添加该参数即可,默认情况下只显示简短的错误信息。
自定义normalizer无法使用bug修复
issue:
PR:
该bug是在7.x版本引入的,因为对自定义analyzer的代码进行了重构,导致所有custom normalizer都无法正常使用。可能因为normalizer的使用者并不是很多,一直到7.5发布后才被发现,该提交在7.6版本已经发布。关于这个bug的修复,有单独一篇文章进行介绍.
Elasticsearch 迁移工具 ESM 更新 0.4.4
资料分享 • medcl 发表了文章 • 9 个评论 • 4259 次浏览 • 2020-05-14 16:07
- 可用于生成测试数据,一般用于压力测试,基于源 ES 或者导入到本地的 JSON 数据,随机修改 ID,可以指定重复次数
- 修复 Routing 参数在不同 ES 版本下的参数差异,支持 1.x\2.x\3.x\5.x 到 6.x\7.x 的相互导入
- 修复终端下不能切换到后台执行的 bug,可以以 crontab 定时执行
- 支持指定 _source 字段导出
- 支持 _source 字段重命名
- 支持文档 _type 重命名
./bin/esm -s -d -x my_index1 -y
my_index2
-n elastic:pass --regenerate_id --repeat_times=10
2.先导出索引文档到本地的文件 dump.json./bin/esm -s -x my_index1 -o dump.json
再基于这份样本,生成 10 份一样的数据到目标集群./bin/esm -i dunp.json -d -y target-index1 --regenerate_id --repeat_times=10
更多使用示例参照项目 README