暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ElasticSearch 概览

程序媛和她的猫 2021-10-03
708

1、ElasticSearch 概述

(1)ElasticSearch 是什么?

ElasticSearch ,elastic 意为“灵活的、弹性的”,search 意为“搜索”,ElasticSearch 即为“灵活的搜索”。

ElasticSearch 简称 ES,它是一个开源的高扩展分布式的、RESTful 风格搜索数据分析引擎。                                                                      

它可以近实时地存储、检索数据;ES 自身带有分布式协调管理功能,扩展性很好,可以扩展到上百台服务器,处理 PB 级别(大数据)的数据。

ES 底层是使用 java 语言开发的,并使用 Lucene 作为其核心来实现所有索引和搜索的功能。ES 通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。

(2)Lucene 是什么?

Lucene 是 Apache 基金会发布的一个开源的全文检索引擎工具包,提供了强大的数据检索功能,它的创始人是资深全文检索专家 Doug Cutting。

但是 Lucene 只是一个提供全文检索功能类库的核心工具包,真正使用它还需要一个完整的服务框架搭建起来进行应用。如果公司有能力的话,可以自己对 Lucene 进行定制化封装,开发针对本公司的搜索引擎,也可以使用基于 Lucene 开发好的开源的搜索引擎,比如最火的 ElasticSearch 和 Solr。

ElasticSearch、Solr 和 Lucene 的关系可以用以下这个比喻来解释:如果说 Elasticsearch 和 Solr 是一辆设计精美、性能卓越的跑车,那么 Lucene 就是为其提供强大动力的引擎。

(3)ElasticSearch 的诞生?

许多年前,一个叫 Shay Banon 的待业工程师跟随他的新婚妻子来到伦敦,他的妻子想在伦敦学习做一名厨师。而他在伦敦寻找工作的期间,接触到了 Lucene 的早期版本,他想为自己的妻子开发一个方便搜索菜谱的应用。

直接使用 Lucene 构建搜索会有很多的坑以及重复性的工作,所以 Shay 便在 Lucene 的基础上不断进行抽象来让 Java 程序嵌入搜索变得更容易一些,经过一段时间的打磨,就诞生了他的第一个开源作品,他给自己的这个作品起了个名字,叫 “Compass”,中文即“指南针”的意思。

之后,Shay 找到了一份新工作,新工作是处在一个高性能分布式的开发环境中。他在工作中渐渐发现,越来越需要一个易用的高性能、实时的、分布式的搜索服务,于是他决定重写 Compass,将它从一个库打造成了一个独立的 Server,并将其改名为 ElasticSearch。

ElasticSearch 发布的第一个版本是在 2010 年的二月份,从那之后,ElasticSearch 便成了 Github 上最受人瞩目的项目之一,并且很快就有超过 300 名开发者加入进来贡献了自己的代码。后来 Shay 和另一位合伙人成立了公司专注打造 ElasticSearch,他们对 ElasticSearch 进行了一些商业化的包装和支持。但是, ElasticSearch 承诺,永远都将是开源并且免费的。

不过,Shay 承诺为妻子开发的菜谱搜索应用,到现在还没做出来……

(4)哪些公司在使用 ElasticSearch?

维基百科:类似于百度百科。

GitHub(开源代码管理):2013年初,摒弃了 Solr,改用 ElasticSearch。GitHub 使用 ElasticSearch 搜索 20 TB 的数据,包括 13 亿文件和 1300 亿行代码。

Stack Overflow(国外的程序异常讨论网站):解决 Bug 问题的网站。当程序报错了,把报错信息粘贴到里面去,搜索有没有对应的答案。也可以自己创建一个问题,提交上去,就会有人在下面讨论和回答。

百度:众所周知,百度是一个搜索网站,它的底层就是使用 ElasticSearch 作为搜索分析引擎。百度使用的 ElasticSearch,单集群最大 100 台机器,200 个 ES 节点,每天导入 30 TB+ 的数据。

阿里、京东等电商网站:使用 ElasticSearch 来检索商品。

日志数据分析:ELK 技术,ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,ElasticSearch,LogStash 和 Kibana。这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK 协议栈。ElasticSearch 用于存储日志数据,LogStash 用于采集和传输数据,Kibana 用于展示数据。目前,大多数公司都有自己的一套 ELK 日志分析平台。

(5)、搜索引擎技术选型(ES or Solr)

ES 和 Solr 都是开源搜索引擎,那么我们在使用时该如何选择呢?

1、最近两年,国内的大小公司使用的搜索引擎基本都是 ES,但并不意味着 Apache Solr 已经死亡,在国外,Solr 仍然是最受欢迎的搜索引擎之一,拥有强大的社区和开源支持。

2、与 Solr 相比,ES 易于安装且非常轻巧,你可以在几分钟内安装并运行 ES。

3、如果需要分布式索引,则需要选择 ES,对于需要良好可伸缩性、性能,ES 是更好的选择。

4、ES 在开源日志管理中占据主导地位,许多组织在 ES 中索引它们的日志以使其可搜索,比如目前最火的 ELK解决方案。

5、随着数据量的增加,Solr的搜索效率会变低,而ES基本没有变化。

6、Solr 当一边添加数据,一边搜索,搜索效率会变低,而 ES 没有影响。也就是说如果我们对实时查询要求比较高的话,最好使用 ES。

2、什么是搜索引擎?

(1)引擎可以快速地返回查询结果。
比如百度、谷歌这种搜索网站,数据量非常大,如果我们想要的搜索结果需要等待数分钟才能展示出来,那么估计没有人会愿意等待。所以作为一个搜索引擎,性能也是一个很重要的考量指标。

(2)查询结果都是相关的,将相关性高的结果排在前面。
搜索返回的结果,希望也能够智能些,最相关的结果要排在前面,简单来说,就是能够猜中用户想要什么。

比如,在线购物时,我搜索了“笔记本电脑”,发现前面都是笔记本的配件,往下翻了很久才能看到真正的电脑,那这用户体验太差了,我就去别人家买了。

所以为了提高用户体验,就需要将和查询条件最相关的查询结果排在最前面。

(3)搜索框自动提示功能。
以百度网站为例,我们在搜索框输入“elasticsearch”就能出现所有和 elasticsearch 有关的内容。

但是我们希望搜索框能够智能些,无需输入“elasticsearch”这个词的全部字母,希望搜索框有自动提示的功能,而且提示的内容要合理,不能胡乱提示。

图1

(4)识别错误的输入,给出自动提示,即使输入错误,仍然能够得到正确的结果。
比如我们想要搜索 swagger 相关的内容,搜索框中即使输入错误,写成了 swager,也能查询到 swagger 的相关信息。

图2

3、ElasticSearch 如何实现搜索功能的?

(1)Lucene 倒排索引加快查找速度。
假设你正在搭建一个博客网站,现在有一个需求,当用户查询“Java”,系统需要返回所有包含“Java”这个关键词的文章。

原始数据见图3,你可能想这样查询,拿出一个文章,去里面一个词语一个词语的查找,使用这种方式,将所有的文章都查询一遍。但是如果数据库中数据量很大呢,这个查询时间得有多长啊。

图3

Lucene 使用倒排索引加快搜索速度,这个索引和 MySQL 索引很类似,都是为了提高查询效率,单独创建出来的一个数据结构。Lucene 倒排索引见图4,在将文章存储到库中的时候,就建立了一个倒排索引,将每个文章分成一个一个词语,在倒排索引中记录每个词语对应的文章ID。当我们想要获取包含“java”的帖子,先去倒排索引中找“Java”,一下子就找到了所有包含“Java”关键字的文章的ID,然后拿着这些ID去查找对应的文章,这种方式相比较拿着词语一个一个比较要快得多。

图4

(2)ElasticSearch 提供了几个相关性算法,用来计算相关性得分,然后根据分数对结果进行排序。

默认情况下,计算文档相关性得分的算法是 TF-IDF(term frequency - inverse document frequency,词频-逆文档频率)。

在 TF-IDF 算法中,影响相关性得分的两个因素如下:
1、词频:所查找的单词在文档中出现的次数越多,得分越高。
2、逆文档频率:如果某个单词在所有文档中比较少见,那么该词的权重就高,得分也就越高。

当在自行车爱好者的博客上搜索“自行车竞赛”的时候,因为“自行车”在所有文档中出现的频率要高于“竞赛”,所以对最后的得分贡献较小,见图5,现在有两个文档,文档1中只出现“自行车”,文档2中只出现“竞赛”,所以文档1的得分 > 文档2的得分。

图5

同时,一篇文章中“自行车”和“竞赛”出现的次数越多,这篇文章的得分越高,见图6,有两个文档,文档1中“自行车”和“竞赛”出现的次数分别是 2 次,文档2中“自行车”和“竞赛”出现的次数分别是 1 次,所以文档1的得分 > 文档2的得分。

图6

除了选择 ES 已经提供好的相关性算法,我们也可以定制化自己的算法,以满足特定的需求

例如,你可以“提升”特定字段的得分,从相关性角度考虑,帖子的标题比文章主体更为重要,这样标题上相匹配的文档会比主体上匹配的文档获得更高的分数;你也可以让精确匹配比部分匹配获得更高的分数;你也可以通过脚本添加定制化条件来改变得分的计算,例如,如果帖子允许用户点赞,可以根据点赞数来提升分数,点赞数越多,得分越高,或者让新的帖子获得更高得分,排在较旧的帖子之前。

(3)精确匹配之外的功能。
ES 有些选项可以让搜索变得多样化,而不再是简单的精准匹配用户的输入。当用户录入与已存储词有所不同的错误拼写、同义词或派生词时,也可以搜索出来结果。当用户不完全清楚搜索什么的时候,这些选项可以给出提示。

1、处理错误的拼写
可以通过配置,让 ES 容忍一些变化,而不仅仅是只查找精确匹配,比如使用模糊查询,“bicycel”的输入同样可以让用户找到关于“bicycles”的博客。

2、支持变体
标题里包含“bicycle”的帖子,同样可以和“bicyclist”和“cycling”的查询匹配上,“elections”同样会匹配“election”。

3、高亮显示
在搜索结果中,匹配的单词会通过加粗来突显。

图7

4、比用户更了解自己
当用户不太清楚具体要搜索什么的时候,可以通过几种方式来协助他们。

一种方法是“聚集统计数据”,聚集是在搜索结果里得到一些统计数据,如每篇文章中“赞”和“分享”的平均数量,根据这些统计信息进行搜索结果的展示。

举个例子,用户进入自行车博客网站时,会在右侧看见最近点赞数、分享数最多的文章,用户如果关注时事热点,他们想看的肯定也是这种大家都关注的事情。

另一种方法,当用户开始输入时,你可以帮助他们发现主流的查询和结果。你可以通过自动提示技术预测他们要输入的内容,你同样可以展示主流的结果,通过特殊的查询类型来匹配前缀、通配符或者正则表达式,也可以使用 ES 提供的讨论建议器


文章转载自程序媛和她的猫,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论