• 谈谈Elasticsearch
  • 发布于 1周前
  • 36 热度
    0 评论
当 Elasticsearch 创始人 Shay Banon 在推文发消息称他们的公司已在纽交所上市时,就萌生了我写这篇文章的想法,迟迟未动笔,一直拖到现在。

在我看来, Shay Banon 的成功都源于兴趣。正如 Shay Banon 曾说过的,他为了给他的妻子做一款食谱搜索引擎的过程中,发现 Lucene 太难用了,才萌生了写 Elasticsearch 的决定,见下文:

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。 在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。

直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。 他发布了他的第一个开源项目 Compass。

后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。

第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名 contributors(目前736名 contributors )。 一家公司已经开始围绕 Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。

据说,Shay 的妻子还在等着她的食谱搜索引擎…

在此,不得不说 Shay Banon 是一名成功的程序员,能抓住用户的痛点,并把这一业余兴趣项目作为一款开源产品,最终组建公司并成功上市敲钟,一个字,牛。

我接触搜索引擎的经历,应该跟大多数读者一样,最早接触的百度、搜狗、Bing、雅虎,后来学会了翻墙,开始接触了谷歌,慢慢意识到隐私的重要性,开始玩 DuckDuckGo,做安全的那几年,对 Shodan、Zoomeye、Fofa 也有一些接触。

对于上面的这些搜索引擎,都离不开这几个核心元素,爬取,数据中心,链接分析,索引,搜索。只不过上面这些搜索引擎之所以能够处理数以亿计的网页,在于它的那些模块使用了分布式。

我还记得第一次对搜索引擎背后的原理感兴趣,是来自大学室友跟他导师做的一个关于 BT 种子搜索的项目。几十万的数据输入一个关键字,那么一瞬间就给出结果了,由于当时我只接触过数据库,一直追问他是怎么建索引的,后来从他的口中,知道一个新名词 Lucene。

说到 Lucene,不得不提它的创始人 Doug Cutting,他对整个开源社区的影响应该说是巨大的,因为他后来相继写出了 Nutch、Hadoop 等相关开源项目。如果没有他的 Lucene 也就不会有现如今的 Elasticsearch,更不会有大数据的快速发展。

我大学期间也研究过 MySQL、 Lucene,了解到 MySQL 用 B+Tree 做为索引结构,而 Lucene 用的是倒排索引,它们不是一回事。后来工作中使用过 Elasticsearch,发现它是在 Lucene 的基础上发展起来的,但是比 Lucene 更加易用,更适用于海量数据。

本文余下的篇幅主要来谈倒排序原理及 Elasticsearch 的生态。

倒排索引原理

我相信很多读者跟我当初第一次接触搜索引擎一样,会思考,为什么查询一片文档中的关键词,使用 Elasticsearch 远比使用 MySQL like 查询快?有的读者会说 Elasticsearch 是搜索引擎,这个回答没错,那为什么搜索引擎可以秒级内将关键词从海量文档中检索出来?关键原因在于它使用了倒排索引技术。

倒排索引是相对于传统正向索引来说的,传统的索引技术基本都是文章索引到关键词,因此,查找关键词需要一片一片的去查找匹配,就像 MySQL like 查询模式,而倒排索引是通过关键词去找文档的技术。

那么什么是倒排索引?举个例子,我们这里有两个文档「Document」,如下。

在存入 Elasticsearch 时,被 ES 根据分词器去建立索引,所谓分词器,即将一句话按照语义或单词进行切分,上述文档会被分词器切分成如下列表「这里不讨论 ES 分词器对于语气组词等的处理,感兴趣的可以学习 IK 中文分析器」:


然后将这些单词与文档号进行对应存储,即可生成 ES 的倒排索引表:

这样,就形成了一个关键词与文档号对应的倒排索引表,这样在用户搜索一些关键词时,就可以通过与倒排索引匹配快速定位到对应的文档,这就是搜索引擎的模型,当然 ES 的实际实现非常复杂,还需考虑分片、索引位置、持久化存储类型等诸多问题,这里就不展开讲了。

看到这里,相信你对倒排序的原理有了初步的理解,感兴趣,可以去读读 Lucene 的源码,相信你会有不少的收获。
 
Elasticsearch 的生态

对于后端开发程序员来说,可能 ES 的接触并不是很多,很多使用场合也仅仅局限于搜索,实际上 ES 除了其强大的搜索能力,还有很多其他特性,如强大的统计与聚合的能力。

在我看来,它是一个较为全能的 NOSQL 数据库,在安全分析「IDS、IPS、日志分析」系统中,ELK 框架至少可以在 50% 的系统中见到。ES 相对于非格式化数据拥有很强的包容性,虽然查询性能相对于 MySQL 来说较慢「在高版本中,ES 引入了缓存机制,使得 ES 的查询数据得到了很大的改善」,但对于秒级场景 ES 应对起来还是搓搓有余的,所以「全能」是 ES 快速得到安全行业青睐的原因。如基于 ELK 的主机安全系统应用 Wazuh,见下图。

根据最新的数据库搜索引擎排名,可以发现 ES 表现出强劲的走势,位居第一。

最后,我想说,Elasticsearch 的成功并不是那么容易可以模仿的,各位读者可以多学习一下这些优秀的开源产品背后的原理,毕竟技多不压身,只会给你下次找工作增加筹码。

.....

10 月 20 日,@梓泉&乎睿数据 捅了「马蜂窝」的事件,想必大家都已经知道了,其实数据造假在整个行业「大到企业,小到个人公众号」已经心照不宣了,项目前期冷启动阶段,爬竞争对手的数据,似乎很多企业都这么干过,但马蜂窝过了冷启动阶段,还这么干,真心说不过去。。。
用户评论