写点什么

和面试官简单聊聊 Elasticsearch

用户头像
escray
关注
发布于: 2021 年 04 月 11 日
和面试官简单聊聊 Elasticsearch

看完这一篇,只要不是面试 Elasticsearch 开发和运维工程师,对于一般的程序员来说,应该足够和面试官谈笑风生了

Elasticsearch 功能

分布式的搜索引擎和数据分析引擎


搜索:百度,网站的站内搜索,IT 系统的检索


数据分析:电商网站,最近 7 天牙膏这种商品销量排名前 10 的商家有哪些;新闻网站,最近 1 个月访问量排名前 3 的新闻版块是哪些


分布式,搜索,数据分析

全文检索,结构化检索,数据分析


全文检索:我想搜索商品名称包含牙膏的商品,select * from products where product_name like "%牙膏 %"


结构化检索:我想搜索商品分类为日化用品的商品都有哪些,select * from products where category_id='日化用品'


部分匹配、自动完成、搜索纠错、搜索推荐


数据分析:我们分析每一个商品分类下有多少个商品,select category_id,count(*) from products group by category_id

对海量数据进行近实时的处理


分布式:ES 自动可以将海量数据分散到多台服务器上去存储和检索


海联数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了


近实时:检索个数据要花费 1 小时(这就不要近实时,离线批处理,batch-processing);在秒级别对数据进行搜索和分析


跟分布式/海量数据相反的:lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量

Elasticsearch 适用场景

国外
  • 维基百科,类似百度百科,牙膏,牙膏的维基百科,全文检索,高亮,搜索推荐

  • The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)

  • Stack Overflow(国外的程序异常讨论论坛),IT 问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案

  • GitHub(开源代码管理),搜索上千亿行代码

  • 电商网站,检索商品

  • 日志数据分析,logstash 采集日志,ES 进行复杂的数据分析(ELK 技术,elasticsearch+logstash+kibana)

  • 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于 50 块钱,就通知我,我就去买

  • BI 系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近 3 年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近 3 年,每年消费金额呈现 100%的增长,而且用户群体 85%是高级白领,开一个新商场。ES 执行数据分析和挖掘,Kibana 进行数据可视化

国内
  • 站内搜索(电商,招聘,门户,等等)

  • IT 系统搜索(OA,CRM,ERP,等等)

  • 数据分析(ES 热门的一个使用场景)

Elasticsearch 特点


可以作为一个大型分布式集群(数百台服务器)技术,处理 PB 级数据,服务大公司;也可以运行在单机上,服务小公司


Elasticsearch 不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的 ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat)


对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接 3 分钟部署一下 ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂


数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch 作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能


最后补充一段来自 Elastic 官网的介绍:


Elasticsearch is the distributed search and analytics engine at the heart of the Elastic Stack. Logstash and Beats facilitate collecting, aggregating, and enriching your data and storing it in Elasticsearch. Kibana enables you to interactively explore, visualize, and share insights into your data and manage and monitor the stack. Elasticsearch is where the indexing, search, and analysis magic happens.

Lucene vs. Elasticsearch


Lucene,最先进、功能最强大的搜索库,直接基于 Lucene 开发,非常复杂,API 复杂(实现一些简单的功能,写大量的 java 代码),需要深入理解原理(各种索引结构)


Elasticsearch,基于 Lucene,隐藏复杂性,提供简单易用的 RESTful API 接口、Java API 接口(还有其他语言的 api 接口)


  • 分布式的文档存储引擎

  • 分布式的搜索引擎和分析引擎

  • 分布式,支持 PB 级数据


开箱即用,优秀的默认参数,不需要任何额外设置,完全开源


关于 Elasticsearch 的一个传说,有一个程序员失业了,陪着自己老婆去英国伦敦学习厨师课程。程序员在失业期间想给老婆写一个菜谱搜索引擎,觉得 Lucene 实在太复杂了,就开发了一个封装了 Lucene 的开源项目,compass。后来程序员找到了工作,是做分布式的高性能项目的,觉得 compass 不够,就写了 Elasticsearch,让 Lucene 变成分布式的系统。

Elasticsearch 核心概念


Near Realtime(NRT)近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概 1 秒);基于 es 执行搜索和分析可以达到秒级


Cluster集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是 Elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常


Node节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“Elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个 Elasticsearch 集群,当然一个节点也可以组成一个 Elasticsearch 集群


Document & field文档,Elasticsearch 中的最小数据单元,一个 document 可以是一条客户数据,一条商品分类数据,一条订单数据,通常用 JSON 数据结构表示,每个 index 下的 type 中,都可以去存储多个 document。一个 document 里面有多个 field,每个 field 就是一个数据字段


# product document{  "product_id": "1",  "product_name": "高露洁牙膏",  "product_desc": "高效美白",  "category_id": "2",  "category_name": "日化用品"}
复制代码


Index索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个 index 包含很多 document,一个 index 就代表了一类类似的或者相同的 document。比如说建立一个 product index,商品索引,里面可能就存放了所有的商品数据,所有的商品 document。


Type类型,每个索引里都可以有一个或多个 type,type 是 index 中的一个逻辑数据分类,一个 type 下的 document,都有相同的 field,比如博客系统,有一个索引,可以定义用户数据 type,博客数据 type,评论数据 type。


商品 index,里面存放了所有的商品数据,商品 document


但是商品分很多种类,每个种类的 document 的 field 可能不太一样,比如说电器商品,可能还包含一些诸如售后时间范围这样的特殊 field;生鲜商品,还包含一些诸如生鲜保质期之类的特殊 field


type,日化商品 type,电器商品 type,生鲜商品 type


  • 日化商品 type:product_id,product_name,product_desc,category_id,category_name

  • 电器商品 type:product_id,product_name,product_desc,category_id,category_name,service_period

  • 生鲜商品 type:product_id,product_name,product_desc,category_id,category_name,eat_period


每一个 type 里面,都会包含一堆 document


{  "product_id": "2",  "product_name": "长虹电视机",  "product_desc": "4k高清",  "category_id": "3",  "category_name": "电器",  "service_period": "1年"}
{ "product_id": "3", "product_name": "基围虾", "product_desc": "纯天然,冰岛产", "category_id": "4", "category_name": "生鲜", "eat_period": "7天"}
复制代码


shard:单台机器无法存储大量数据,es 可以将一个索引中的数据切分为多个 shard,分布在多台服务器上存储。有了 shard 就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个 shard 都是一个 Lucene index。


replica:任何一个服务器随时可能故障或宕机,此时 shard 可能就会丢失,因此可以为每个 shard 创建多个 replica 副本。replica 可以在 shard 故障时提供备用服务,保证数据不丢失,多个 replica 还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认 5 个),replica shard(随时修改数量,默认 1 个),默认每个索引 10 个 shard,5 个 primary shard,5 个 replica shard,最小的高可用配置,是 2 台服务器。

Elasticsearch 核心概念 vs. 数据库核心概念



发布于: 2021 年 04 月 11 日阅读数: 134
用户头像

escray

关注

Let's Go 2017.11.19 加入

Let's Go,用 100 天的时间从入门到入职

评论

发布
暂无评论
和面试官简单聊聊 Elasticsearch