我想跟大家先讲这么一个故事。在2017年,我有幸参与到ElasticSearch 的创始人 Shay Banon 的现场分享。Shay Banon 在谈及当年接触 Lucene 并开发 Elasticsearch 的初衷的时候, Shay Banon 认为自己参与 Lucene 完全是一种偶然。
ElasticSearch 开发出来的初衷,竟然是为了一个菜谱。
当年Shay Banon还是一个待业工程师,跟随自己的新婚妻子来到伦敦,妻子想在伦敦学习做一名厨师,而自己则想为妻子开发一个方便搜索菜谱的应用,所以才接触到 Lucene。(注释:Lucene是一个开源的全文检索引擎工具包)
那为什么又会有ElasticSearch呢?因为直接使用 Lucene 构建搜索有很多问题,包含大量重复性的工作,所以 Shay Banon 便在 Lucene 的基础上不断地进行抽象,让 Java 程序嵌入搜索变得更容易,经过一段时间的打磨便诞生了他的第一个开源作品“Compass”,中文即“指南针”的意思。
大概大神都是这样吧,就是解决自己生活中遇到的一个小问题,然后一不小心,喔,完成了一部史诗级的世界性软件巨作。之后,他找到了一份面对高性能分布式开发环境的新工作,在工作中他渐渐发现越来越需要一个易用的、高性能、实时、分布式搜索服务,于是决定重写 Compass,将它从一个库打造成了一个独立的 server,并创建了开源项目,也就是后来的 Elasticsearch。
ElasticSearch ,是基于Lucene构建的开源、分布式、高性能、高可用、可伸缩、Restful接口的全文搜索和分析系统。
故事讲完了,大家一定很好奇,搜索引擎不是一个非常难的东西吗?你看百度,Google,不都是一个搜索引擎,这太复杂了趴?
对啊!搜索引擎就是一个非常难的东西啊,所以我们今天的主角 ElasticSearch 才简单得可贵。
总言
ElasticSearch 是一门准实时的搜索引擎,而不仅仅是一门用于搜索的实时搜索引擎,ELK(ElasticSearch、Logstash、Kibana)是当前比较稳的模式。大蕉曾经在线上处理存量十几亿,增量几百万的反欺诈。ElasticSearch 已经在 阿里云,腾讯云有云服务。
我们这样来定位 ElasticSearch
1、分布式的搜索引擎和数据分析引擎
2、全文检索、结构化检索、数据分析
3、对海量数据进行近实时处理
这里面我们可以抓住几个关键词,分布式、全文、数据分析、海量、近实时。其他中文都好理解,近实时是什么鬼?听我细细道来。
解决的核心业务场景
我们先聊几个比较常见的业务场景。
1、在服务器日志文件中查找某个错误日志信息
2、在大量新闻中查找出现某位明星的新闻
3、在代码库中搜索某行代码段信息
4、在电商网站上输入某个商品,高亮显示商品的关键字。
如果没有搜索引擎,我们会怎么做?
like or like or like or like or like or like
别无他法,数据库疯狂的 like or like or like 。你扛得住?我反正扛不住。
业界成功案例
那凭什么你大蕉说完成这些述求可以使用 ElasticSearch 呢?我就不信。首先,ElasticSearch 在业界已经得到广泛的应用和验证。
比如极客时间的副产品极客搜索。检索系统就是采用开源的 Elasticsearch,从近实时、可扩展、中文分词、搜准率和同义词等几个角度出发,对聚合结果按规则进行索引构建,并进行了部分同义词调优。
早在2013年初,GitHub就抛弃了Solr,采取ElasticSearch 来做PB级的搜索。
而维基百科,早早就启动了以elasticsearch为基础的核心搜索架构。SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务”。
大蕉的经历
说了这么多,你大蕉做了啥?
大蕉毕业后就职于平安,完成了平安普惠大数据几十亿数据的风控反欺诈系统的从0到1的搭建,其中 ElasticSearch 就是作为核心的存储和搜索系统,完成百万用户社交网络的秒级反欺诈风控。
怎么落地 ElasticSearch
好,说了这么多,我想用 ES ,那我怎么知道怎么用呢?难道把原来的 MySQL全部迁移到所谓的 ElasticSearch 上?这不太可能吧。
没关系的,这里有两条非常非常好走的路供你走。
1、追加到现有系统中 如果你已经有一个在运行的复杂的系统,你的需求之一是在现有系统中添加检索服务。一种非常冒险的方式是重构系统以支持ES。而相对安全的方式是:将ES作为新的组件添加到现有系统中。比如 mysql、oracle选择 logstash-input-jdbc 插件同步即可。然后直接在原有系统里直接调用 ElasticSearch 的搜索服务就好了。
2、直接用 ELK 技术栈,一行代码都不用,直接用 Beats Logstash 收集数据,ElasticSearch 作为存储引擎, Kibana 作为图表和搜索产品直接使用。
还有一个疑问,为什么说 ElasticSearch 不仅仅是用于搜索?
其实 ElasticSearch 还提供了一套非常好的数据分析API,以及一套非常好的机器学习的API。所以作为实时的 OLAP 平台也是胜任的。
怎么入门 ElasticSearch
那我怎么入门 ElasticSearch 呢?
https://www.elastic.co/guide/index.html这个网站上有官方权威的中文版教程,从安装,搜索,原理,应用,都有很完善的教程和案例,可以在里边按顺序翱翔。
如果要自己玩,那么下边的四步其实就搞定了:
下载 https://www.elastic.co/cn/downloads/elasticsearch
解压
运行 bin/elastic
浏览器输入 http://127.0.0.1:9200/
当然还有很多人关注客户端的问题,就是 ES 究竟支持哪些语言。
https://www.elastic.co/guide/en/elasticsearch/client/index.html
HTTP/Java/Go/JavaScript/.NET/PHP/Perl/Python/Ruby/Hadoop/Spark 等
简单来说,你能想到的语言,基本都支持。。
为什么选它作为搜索引擎?
1、简单,没有额外条件,自成集群。
2、开源,Java 实现,稳。
3、水平扩展是真的优秀。
4、全文索引暂时没见到比这个好的。
5、中文分词也已经做得很棒了。
6、各种客户端非常齐全。
有什么坑?
1、权限、告警、安全、报告、图表、机器学习,不是开源的,商用需要交钱。
2、事务控制并不好。
为什么说 ElasticSearch 是准实时的?
为了提高索引性能,Elasticsearch 在写入数据时候,采用延迟写入的策略,即数据先写到内存中,当超过默认 1 秒会进行一次写入操作,就是将内存中 segment 数据刷新到操作系统中,此时我们才能将数据搜索出来,所以这就是为什么 Elasticsearch 提供的是近实时搜索功能,而不是实时搜索功能。当然像我们的内部系统对数据延迟要求不高的话,我们可以通过延长 refresh 时间间隔,可以有效的减少 segment 合并压力,提供索引速度。
总结
如果说你只能记住一点点东西,那么就记住下面两句话吧。
ElasticSearch 是一门准实时的搜索引擎,而不仅仅是一门用于搜索的实时搜索引擎,OLAP也支持,客户端也很丰富。搜索引擎并没有想象中那么难使用,别怕,自己搭建很方便,各种云服务也很齐全。
来自同学们的一些疑问的问答
1.事务控制并不好。一般怎么避免处理?
需要事务控制的场景,自行切换到其他支持事务的数据库上。
2.大蕉了解solr不,为啥用es不用solr 我司就还在用solr进行搜索
Solr 索引效率没有 ES 高,非常明显,主要瓶颈在 IO 这块,ES在实时搜索领域碾压solr。
3.多表关联查询支持吗?
ES6.X 后支持,我使用的场景不多,更多还是单索引内的聚合。
4.es适不适用全量存储,可以当做“db”用,还是要存储索引用字段,和主键,再查bd或者缓存之类的?
可以直接当db用,ES 自带备份,负载均衡。如果是搜索的场景,或者匹配的场景,比传统的DB支持性更好,数据安全也有不错的保障。
5.之前没接触过ES,想问下,对于远程主机文件内容搜索是否可以支持,比如说我有很多云主机,文件都在云主机的log目录下,我想要搜索这些日志文件里的关键字内容,做一个日志查询的功能?
使用 Logstach,全部同步到 ElasticSearch 就好了,很方便。在每个云主机上,安装一个类似 Agent 的采集器东西,就可以了。比如官方就有一款叫 BEATS https://www.elastic.co/cn/products/beats
6.日志在不断增加,那每次将日志加载进es是整个文件全量重新导入还是有增量的设计
一般日志都是追加,都是增量设计。如果一定要全量,一定要自己设置好主键
7.我理解es是不是适用于对实时性要求不高的场景
恰恰相反,es就是适用于实时性比较高的场景。所谓的准实时,是指1秒后能搜索到,基本等于实时。
8.直接进es吗 还是mq到es ?去重怎么样?
只能根据id去重,如果对于重复要求很高,要自行设计id系统,先查询后写入。
(感谢iMLe0n's 同学的整理)