中间件与数据库:Elasticsearch
ElasticSearch 索引设计指南
ElasticSearch(以下简称:ES )是一个分布式、RESTful 风格的搜索和数据分析引擎。区别于传统关系型数据库(比如:MySQL、Oracle 等),ES 在定义数据模型和搜索方式上非常灵活,数据模型可以采用静态数据映射与动态数据映射,搜索方式也支持多维度类型的搜索(结构化数据、非结构化数据、地理位置、指标参数等)。如果对事务性要求不高或者事务性操作在 RDMS 端,可以考虑使用 ES 作为海量数据存储与检索分析的平台。用户在创建新索引时,可以直接写数据,所有配置走默认,收缩自如、十分灵活;也可以精细化评估,按照自己的业务需求,提前做好索引的 settings 和 mappings 的设置,未雨绸缪、尽在掌握。
Elasticsearch 脚本安全使用指南
- Elasticsearch 脚本有没有替代方案?
- 如何在 Elasticsearch 端限制脚本的使用?
- 我们可以控制 Elasticsearch 脚本的使用吗?
Elasticsearch 检索性能优化实战指南
检索性能的优化涉及知识点比较零散,以官方文档的检索性能优化部分作为大框架和主线,结合实战经验和咨询经验用通俗易懂的语言做下解读。
Elasticsearch 如何实现相似推荐功能?
拿我们身边的算法“投喂”为主的头条、抖音、微信视频号等举例,如果你喜欢乒乓球,每天推送给你的都是乒乓球比赛视频集锦;如果你喜欢成功人士演讲,每天都是马云、马化腾、刘强东等商业巨鳄的演讲。
再拿电商的示例如下:比如我近期购买的吴军老师推荐的科普经典巨著《从一到无穷大》,京东会给我推荐樊登读书带火的书《微积分原理》。
Elasticsearch 线上问题实战——如何借助 painless 更新时间?
对于给定的时间字段值,如何用 painless 脚本实现减去 5 分钟的处理?
Elasticsearch 运行时类型 Runtime fields 深入详解
实战业务中,遇到数据导入后,但发现缺少部分必要字段,一般怎么解决?
比如:emotion 代表情感值,取值范围为:0-1000。
其中:300-700 代表中性;0-300 代表负面;700-1000 代表正面。
但实际业务中,我们需要:中性:0;负面:-1;正面:1。
如何实现呢?
Search indexing optimisation
Learn about the different optimisation techniques when building a search index.
基于MySQL binlog日志,实现Elasticsearch近实时同步实践
在我们的开发过程中,经常会在一个项目中使用多种数据库系统。在一些特定场景下,我们希望把数据从一种数据库,同步到另一种异构的数据库,以便进行数据分析统计、完成实时监控、实时搜索等功能。这个异构数据源同步的过程称为Change Data Capture(变化数据捕获)。
我们本文讨论的是Source为MySQL、Target为ElasticSearch的场景下,进行增量和全量同步操作过程。众所周知,MySQL数据库凭借其性能卓越、服务稳定、开放源代码、社区活跃等因素,成为当下最流行的关系型数据库,但是在数据量级较大或涉及到多表操作时,亦或是需要根据地理位置进行查询时,MySQL通常不能给我们很好的支持。
为了解决MySQL查询缓慢、无法查询的问题,我们通常采用ElasticSearch等进行配合检索。在传统方式中,将MySQL同步数据到ElasticSearch通常采用的是双写、MQ消息等形式,这些形式都存在着耦合高、性能差、丢失数据等风险。
所以我们需要探索出一套对业务无侵入的MySQL同步至ElasticSearch异构数据库的解决方案。本文将分别从增量同步、全量同步两个层面进行探讨。
Elasticsearch 线上问题排查——搞一天了,明天还要给客户解决这个问题
Elasticsearch 线上实战问题排查复盘。
如何从 0 到 1 搭建代码全局检索系统
前端团队的项目有几百个左右,想要查找某个接口 API 或者某个 NPM 包以及一些关键词在哪些项目中使用到,需要每个开发同学在自己维护的项目里全局搜索一遍或者写个脚本跑一遍,然后统计上去,费时费力。本文将为你介绍全局检索系统。
Elasticsearch 字段膨胀不要怕,Flattened 类型解千愁!
Elasticsearch Mapping 如果不做特殊设置,默认为 dynamic。dynamic 的本质就是:不加约束的动态添加字段。这样对某些日志场景,可能会产生大量的未知字段。字段如果持续激增,就会达到 Elasticsearch Mapping 层面的默认上限,对应设置和默认大小为:index.mapping.total_fields.limit:1000。
我们把这种非预期字段激增的现象或结果称为:字段膨胀。
拿自己线上环境示例,说一下 dynamic 的副作用。在一个实际业务环境,混淆了检索和写入的语法,会导致将检索语句动态认定为新增 Mapping 字段。
当然,如果是非常复杂的大 bool 检索语句,会导致 Mapping 变得非常复杂甚至会出现字段膨胀的情况。
Elasticsearch ORM框架
在使用Elasticsearch的过程中,你还在为构建Elasticsearch的DSL语句而苦恼?还在为构建复杂冗长的条件而头疼?还在为一次次的响应提取而奔溃?那么你需要一个简单方便易上手的ES ORM框架:ebatis!
Composite 聚合——Elasticsearch 聚合后分页新实现
在常规检索的基础上,用户期望返回基于特定字段的聚合结果,且用户期望分页查看检索和聚合结果。
如下图所示:以2020东京奥运会热点新闻亚洲飞人"苏炳添”为例,用户期望查看有关“苏炳添”的新闻,同时期望查看相同标题的相似文章列表。
Elasticsearch 设置默认值的三种方式
在使用 Elasticsearch 过程中,不免还会有 Mysql 等关系型数据库的使用痕迹,以下两个都是实战开发问到的问题:
- Elasticsearch 新增字段,能在 Mapping 设置默认值吗?
- Elasticsearch 有什么好的方式维护文档的 create_time (创建时间)和 update_time (更新时间)吗?
本文就从 Elasticsearch 默认值的实现方案说开去。
拆解一个 Elasticsearch Nested 类型复杂查询问题
有个复杂的场景涉及到按照求和后过滤,user_id是用户编号,gender是性别,time_label是时间标签,时间标签是nested结构,intent_order_count是意向订单数量,time是对应时间。
现在要筛选出在20210510~20210610,意向订单数总和为26的男性用户,请问应该怎么写dsl语句?
感觉这个场景很复杂,涉及到array判断后求和,然后求和结果做筛选条件。
Elasticsearch 索引生命周期管理 ILM 实战指南
关于人生,有人这么说:“人,生来一个人,死去一个人,所以,人生就是一个人生老病死的简称。”
在基于日志、指标、实时时间序列的大型系统中,集群的索引也具备类似上图中相通的属性,一个索引自创建之后,不可能无限期的存在下去, 从索引产生到索引“消亡”,也会经历:“生、老、病、死”的阶段。
我们把索引的“生、老、病、死”的全过程类比称为索引的生命周期。