17 ElasticSearch解决大数据量检索难题

理想的书籍是智慧的钥匙。

——列夫·托尔斯泰

引言

如果你的项目里有超过千万上亿级别的数据,且数据日增量较大需要高性能检索时,如订单数据,你该怎么办?

作为面试官,你需要找一个能解决这个问题的人!为应聘者,你该如何回答面试官这个问题?

你可以了解下使用搜索引擎框架,Elasticsearch (ES)是一个不错的开源搜索引擎框架。我们可以把 ES 当做“数据库”来使用,全球很多知名社区的全文检索都采用ES,如维基百科、Stack Overflow、Github等。

ElasticSearch是开源的,它基于lucene,是伸缩性强、分布式、高可用的全⽂搜索引擎,可以简单地通过RESTful 使用JSON格式索引数据。

尝试想一下,如果你做的是一个知识库系统,系统里有大量文章,如果你想通过某一个或关键字检索文章的内容,如果用MySQL来做这件事,光靠 like 查询根本无法满足,全文检索就是对一篇文章进行索引,ES可以把内容根据词的意义进行分词,然后分别创建索引,例如”我要励志做一个有追求的程序员” ,经过ES分词后是:“我“,“我要”,”励志“,“一个“,”有追求“,“程序员”,无论你根据哪个关键词去检索,都会检索到这句话。

让你不需要了解背后复杂的逻辑,即可完成搜索,Elasticsearch致力于隐藏分布式系统的复杂性。以下这些操作都是在底层自动完成的:

  1. 将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。
  2. 将分片均匀的分配到各个节点,对索引和搜索做负载均衡。

根据ES支持全文索引这个特性,我们还可以通过它做很多所有关于模糊搜索的功能,大数据量多维度聚合也是ES的强项,如天猫商城,通过关键字搜索商品,输入iph后就会自动加载iphone相关的所有商品,这是典型的搜索引擎使用场景。

1.面试官:我看你简历有写项目里有使用了ES,哪些场景用到了ES?

问题分析: 凡事大数据量且需要检索的,这个时候你都可以想到ES,传统关系型数据库查询速度变慢,数据库分表联合查询速度慢。

我:

有这样一个需求场景,运营系统需要一个订单分析工具,当时我们的订单库总数已经远远超过亿级别数据量,每天增量在百万级。

系统初期订单查询主要采用MySQL查询,并没有使用其他数据库,随着业务的发展,系统主要面临两个挑战:

  1. 随着数据增多,MySQL 分库分表后单张表数据依然增加到了几千万数据量级,查询越来越慢。
  2. 查询中带有大量聚合运算,如过滤计算异常订单总数,完成订单总数,计算订单金额等,MySQL并不擅长使用sql做大规模运算。

针对上述两个问题,我使用了 Elasticsearch 完美地应对慢查询这个问题,我使用ES作为主查询数据源,MySQL作为降级备案,如果 ES 集群因为各种原因不可用了,系统会把订单查询数据源自动切换到 MySQL 数据源,对于运营系统,虽然查询会变慢,但是不会耽误正常使用,而且这种降级的概率也极少发生。

系统架构图这样的:(尽量给面试官展示明白这个图)


重点关注红色框,我使用了 ES 作为首选订单查询源,MySQL作为备份数据源,中间加入自动降级开关。

面试官:那使用了ES后结果如何?

我:使用 ES 后,查询速度当然是大大的提高。

使用MySQL的时候99%的查询时间在10s+,架构引入ES后上线后,查询时间迅速降低到毫秒级别。

我还保留了性能监控的图放在我述职报告里,为升级加薪打下扎实的基础。

面试官一直点头,对我这一波操作非常认可。

2.面试官:关于ES的一些概念名字你了解多少?如索引,文档,倒排索引这些东西你是怎么理解的?

问题分析:

有些人刚刚接触 Elasticsearch 的时候,只顾用,只知道ES快,能装很多数据,但是面试官稍微问了一个倒排索引就懵逼了,还好意思说你会用搜索引擎?

我:

先说说ES中的 Index,Document,Type,以及对应MySQL数据库

索引(Index):

索引的概念相当于MySQL里数据库的概念,用ES创建一个索引就是创建一个库,比如电商系统里给订单创建一个订单的索引,那客服系统就可以通过订单索引快速查询订单所有信息快速处理客诉。

文档(Document):

ES属于文档型数据库,文档的概念就相当于MySQL里一条数据的概念,很多个文档(很多条数据)构成了一个索引。

类型(Type)

上面说文档的概念就相当于MySQL里一条数据的概念,MySQL里一条数据有很多个字段,比如订单号,用户手机号,订单金额等,Type 的概念相当于根据每个字段聚合所一张表,如根据订单号分组,按照手机号分组,这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤文档,无论根据哪个字段搜索都有对应的Type(表)。

如果还不明白,直接给你整理成表:ES VS Mysql

  ElasticSearch 关系型数据库:MySQL
对应关系: 索引
对应关系: 类型type 数据表
对应关系: 文档
对应关系: 字段Field

最重要的倒排索引

Tip: 如果你使用过 Elasticsearch 不知道倒排索引的概念那恐怕有点说不过去,倒排索引也叫反向索引(Inverted Index)

(开始给面试官举例分析倒排索引,我可是货真价实做过功课的)

有这样三段话:

  1. hello everyone
  2. this article is based on inverted index
  3. which is hashmap like data structure

使用ES保存后结构如下:

 hello                (1, 1) everyone             (1, 2)this                 (2, 1)article              (2, 2)is                   (2, 3); (3, 2)based                (2, 4)on                   (2, 5)inverted             (2, 6)index                (2, 7)which                (3, 1)hashmap              (3, 3)like                 (3, 4)data                 (3, 5)structure            (3, 6)

hello 出现在第1句话第1个单词,所以是(1, 1) ,is (2, 3); (3, 2) 表示is出现在第2句第3个单词和第3句第2个单词,这样经过拆分后,每个关键词出现在哪句话哪个位置都一目了然,非常方便检索,这便是倒排索引的概念。试想一下,我们使用的百度或是谷歌检索,是不是这种数据结构更容易让我们找到你想要的所有内容,这便是倒排索引带给我们的便利之处,倒排索引允许快速全文搜索,但是在将文档添加到数据库时会增加处理成本

面试官: 行了行了,我知道你理解了,时间有限咱先不聊这个了。

这才是面试理想效果,让面试官无话可说,?。

总结

  • 如果你要做分布式的实时文件存储,每个字段都被索引并可被搜索;
  • 如果你要做实时分析搜索;
  • 如果你要处理PB级结构化或非结构化数据;

这个时候请先想到使用搜索引擎。

关于 ES 的特性是使用场景概括:

  1. 大数据量聚合检索和排序,如计算用户订单总金额,订单数据等。
  2. 自动补全,如搜索框通过关键字自动补全。
  3. 高亮查询。
  4. 关键字检索,模糊检索,拼音查询。
  5. 记录系统后台日志,日志检索。

推荐阅读

  1. 更多使用场景可以延伸阅读此篇:Spark Streaming + Elasticsearch构建App异常监控平台
  2. 《ElasticSearch:可扩展的开源弹性搜索解决方案》

面试精讲之面试考点及大厂真题 - 分布式专栏 17 ElasticSearch解决大数据量检索难题相关推荐

  1. 面试精讲之面试考点及大厂真题 - 分布式专栏 15 如何解决消息重复,保证消息顺序问题

    15如何解决消息重复,保证消息顺序问题 自信和希望是青年的特权. --大仲马 引言 我在<12.项目中为什么要使用消息队列>中列举了两个使用消息队列的例子. (1)收银系统,确认收款成功, ...

  2. 面试精讲之面试考点及大厂真题 - 分布式专栏 01 开篇词:我是怎样带你通过大厂面试

    01 开篇词:我是怎样带你通过大厂面试 自信和希望是青年的特权. --大仲马 学习编程是一场修行,要经历从 0 到 1,普通人从自己的错误中学习,聪明人从别人的错误中学习. 授人以鱼不如授人以鱼杆儿, ...

  3. 面试精讲之面试考点及大厂真题 - 分布式专栏 18 谈谈怎么理解幂等,接口如何保证幂等

    18谈谈怎么理解幂等,接口如何保证幂等 时间像海绵里的水,只要你愿意挤,总还是有的. --鲁迅 引言 稳定性设计第一篇:这一小节开始讲设计系统稳定性保证的相关设计,谁都不想自己负责的系统三天两头就出故 ...

  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 16 数据库如何做分库分表,读写分离

    16 数据库如何做分库分表,读写分离 宝剑锋从磨砺出,梅花香自苦寒来. --佚名 引言 2016年第一次接触分布式微服务项目后,我在简历上写了我使用了微服务.分库分表技术,那么问题来了,面试官说接下来 ...

  5. 面试精讲之面试考点及大厂真题 - 分布式专栏 11 Redis热点key大Value解决方案

    11 Redis热点key大Value解决方案 时间像海绵里的水,只要你愿意挤,总还是有的. --鲁迅 引言 上期分析了<Redis 雪崩,穿透,击穿三连问>,看了我的分析后回答面试官肯定 ...

  6. 面试精讲之面试考点及大厂真题 - 分布式专栏 07 说一说什么是正向代理,反向代理

    07 说一说什么是正向代理,反向代理 世界上最快乐的事,莫过于为理想而奋斗. --苏格拉底 引言 05小节面完了RPC相关的一系列问题,面试官确定我对分布式架构的理论知识和服务间通讯框架(RPC) 确 ...

  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 04 谈谈你对分布式的理解,为什么引入分布式?

    04谈谈你对分布式的理解,为什么引入分布式? 引言 刚刚毕业第一份工作,没接触过分布式微服务相关的知识,后来换工作才了解到这些,面试官看了我简历里写了分布式相关,就开始揪住这个问题问,虽然一知半解地说 ...

  8. 面试精讲之面试考点及大厂真题 - 分布式专栏 03 阿里华为资深HR面试套路全揭晓

    03 阿里华为资深HR面试套路全揭晓 HR 面试套路大全 如果你技术面试过了,进入最后一轮 HR 谈薪资,先别高兴太早,千万不要轻视 HR.BAT 大公司,HR 有一票否决权,即使你技术 OK,领导也 ...

  9. 面试精讲之面试考点及大厂真题 - 分布式专栏 05 公司使用什么RPC框架,聊聊你理解的RPC原理

    05 公司使用什么RPC框架,聊聊你理解的RPC原理 引言 前些年我们在做一个规模不大的系统的时候,也就是单体架构,一台服务器部署上一个应用和数据库也就够了.但是现代化互联网公司业务逐渐扩大,服务逐渐 ...

最新文章

  1. idea插件手动安装
  2. boost::iterator::permutation_iterator用法的测试程序
  3. 汇编语言学习笔记(五)
  4. Leetcode--239. 滑动窗口最大值
  5. python封装api给vue_Vue axios api统一管理的封装
  6. 【Elasticsearch】请在64位平台上使用Lucene的MMapDirectory
  7. ie浏览器框架不显示_thinkphp框架下后台验证码不显示
  8. APT 分析报告:钓鱼邮件网址如何混淆 URL 逃避检测?
  9. 动态代理(2)----动态代理和AOP
  10. mysql jpa默认值_Spring JPA-枚举中枚举字段的默认值
  11. vue 使用代理(proxyTable)报错500
  12. 易经占卜的演变与人工取名
  13. Package cmake is not available, but is referred to by another package.
  14. SEO逆东子站生成和权重站提交工具
  15. C++中的开辟/释放动态空间new/delete
  16. Linux系统在线安装和查看git版本
  17. ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/ma
  18. 【俞吾金】哲学的“世界”概念
  19. linux 命令英文全称,linux 命令英文全称
  20. App邀请注册如何提高效率

热门文章

  1. 腾讯QQ空间g_tk算法
  2. DataGrid 导出到 Excel 的帮助类
  3. Magento: 自定义用户登录导向页面 Redirect Customer to Previous Page After Login
  4. Anti-AdBlock 反AdBlock
  5. PHP 查看系统文件时间戳
  6. JUC强大的三个辅助类
  7. C/C++——各种类型int、long、double、char表示范围(最大最小值)
  8. 了解媒体播放控件 winform
  9. 文件字符输入流 java
  10. 构造方法重载 java 1615136407