共计 2791 个字符,预计需要花费 7 分钟才能阅读完成。
Elasticsearch 是什么?
Elasticsearch 简称 ES,是一个基于 Lucene 构建的开源、分布式、Restful 接口的全文搜索引擎,还是一个分布式文档数据库。天生就是分布式、高可用、可扩展的,可以在很短的时间内存储、搜索和分析大量的数据。
什么是全文搜索?
全文搜索也叫全文检索,是指扫描文章中的每一个词,对每一个词进建立一个索引,指明该词在文章中出现的次数和位置,当前端用户输入的关键词发起查询请求后,搜索引擎就会根据事先建立的索引进行查找,并将查询的结果响应给用户。
这里有两个关键字:分词和索引,Elasticsearch 内部会完成这两件事情,对保存的文本内容按规则进行分词,并对这些分词后的词条建立索引,供用户查询。
什么是倒排索引?
全文搜索过程根据关键词创建的索引叫倒排索引,顾名思义,建立正向关系“文本内容 - 关键词”叫正排索引,后续会介绍,倒排索引就是把原有关系倒过来,建立成“关键词 - 文本内容”的关系,这样的关系非常利于搜索。
举个例子:
- 文本 1:I have a friend who loves smile
- 文本 2:I have a dream today
先进行英文分词,再建立倒排索引,得到一份简易的“关键词 - 文本”的映射关系如下:
关键词 | 文本编号 |
---|---|
I | 1,2 |
have | 1,2 |
a | 1,2 |
friend | 1 |
who | 1 |
loves | 1 |
smile | 1 |
dream | 2 |
today | 2 |
有了这个映射表,搜索 ”have” 关键词时,立即就能返回 id 为 1,2 的两条记录,搜索 today 时,返回 id 为 2 的记录,这样的搜索性能非常高。当然 Elasticsearch 维护的倒排索引包含更多的信息,此处只是作简易的原理介绍。
Elasticsearch 什么场景适用?
常见场景
- 搜索类场景
常见的搜索场景比如说电商网站、招聘网站、新闻资讯类网站、各种 app 内的搜索。
- 日志分析类场景
经典的 ELK 组合(Elasticsearch/Logstash/Kibana),可以完成日志收集,日志存储,日志分析查询界面基本功能,目前该方案的实现很普及,大部分企业日志分析系统都是使用该方案。
- 数据预警平台及数据分析场景
例如电商价格预警,在支持的电商平台设置价格预警,当优惠的价格低于某个值时,触发通知消息,通知用户购买。
数据分析常见的比如分析电商平台销售量 top 10 的品牌,分析博客系统、头条网站 top 10 关注度、评论数、访问量的内容等等。
- 商业 BI 系统
比大型零售超市,需要分析上一季度用户消费金额,年龄段,每天各时间段到店人数分布等信息,输出相应的报表数据,并预测下一季度的热卖商品,根据年龄段定向推荐适宜产品。Elasticsearch 执行数据分析和挖掘,Kibana 做数据可视化。
常见案例
- 维基百科、百度百科:有全文检索、高亮、搜索推荐功能
- stack overflow:有全文检索,可以根据报错关键信息,去搜索解决方法。
- github:从上千亿行代码中搜索你想要的关键代码。
- 日志分析系统:各企业内部搭建的 ELK 平台。
- 等等
Elasticsearch 的架构图
架构各组件简单释义:
- gateway 底层存储系统,一般为文件系统,支持多种类型。
- distributed lucence directory 基于 lucence 的分布式框架,封装了建立倒排索引、数据存储、translog、segment 等实现。
- 模块层 ES 的主要模块,包含索引模块、搜索模块、映射模块。
- Discovery 集群 node 发现模块,用于集群 node 之间的通信,选举 coordinate node 操作,支持多种发现机制,如 zen,ec2 等。
- script 脚本解析模块,用来支持在查询语句中编写的脚本,如 painless,groovy,python 等。
- plugins 第三方插件,各种高级功能可由插件提供,支持定制。
- transport/jmx 通信模块,数据传输,底层使用 netty 框架
- restful/node 对外提供的访问 Elasticsearch 集群的接口
- x-pack elasticsearch 的一个扩展包,集成安全、警告、监视、图形和报告功能,无缝接入,可插拔设计。
Elasticsearch 安装使用
官网地址
https://www.elastic.co/cn/
上面有各版本的下载地址,官方文档和使用示例,请自行下载安装包。
源码地址
https://github.com/elastic/el…
上面有各版本的源码地址,可以切换到指定版本进行研究,目前选用版本为 6.3.1
安装步骤
- 环境要求
JDK 1.8 及以上
- 官网下载安装包,在指定目录下直接解压
- 执行 bin/elasticsearch(Linux,注意不能使用 root 账户)
binelasticsearch.bat(Windows) - curl http://localhost:9200/ 或浏览器打开 http://localhost:9200/ 地址,看到下面的响应表示启动成功:
{
"name" : "node-1",
"cluster_name" : "hy-application",
"cluster_uuid" : "lJ4DRWOvQauAy-VEYiZc2g",
"version" : {
"number" : "6.3.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "eb782d0",
"build_date" : "2018-06-29T21:59:26.107521Z",
"build_snapshot" : false,
"lucene_version" : "7.3.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
- kibana 下载解压启动
执行 bin/kibana(Linux,注意不能使用 root 账户) 或 binkibana.bat(Windows),如果 kibana 和 elasticsearch 部署在同一台机器上,使用默认的配置文件即可。
- 验证 kibana,浏览器上输入 http://192.168.17.137:5601/,出现如下界面表示启动成功:
图二
小结
本篇简单介绍了 Elasticsearch 的基本概念,适用场景和主要的功能框架,以及最简单的用于学习验证的安装启动步骤,作为 Elasticsearch 系统的开篇学习,Elasticsearch 有个特点就是开箱即用,如果是用作学习,或是中小型应用,数据量比较少、操作不是很复杂的话,直接启动就可以用了。后续的 Elasticsearch 学习,如无特别说明,均以 6.3.1 版本为例。
专注 Java 高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java 架构社区