一 什么是Elasticsearch
在解释什么是Elasticsearch之前,让我们来回顾一下我们每天都在网页上面重复做的一件事情--“搜索”。没错,当我们需要了解一个东西的时候,我们会不自觉的打开搜索网站,例如百度,360,搜狗等;或者当我们需要购买一件物品时,我们打开淘宝,京东,唯品会等购物网站,做的第一件事情,仍然还是搜索我们需要的物品的关键词。
搜索已经渗透了我们生活的方方面面,成为了讲究快速,高效的处理事情的方式。而Elashticsearch正是处理这类搜索的搜索引擎,它能够帮助我们快速准确的得到想要的答案。
Elasticsearch是构建在Apache Lucene之上的开源分布式搜索引擎。Lucene是开源的搜索引擎包,使用JAVA实现,允许你通过自己的Java应用程序实现索引存储和搜索功能。Elashticsearch充分利用Lucene,并在其基础上进行了拓展,使得存储,索引,搜索都变得更快更容易更准确。Elasticsearch除了直接与Java应用程序对接外,其还具备了一套Restful风格的接口,不管是使用什么计算机语言,都能够容易的通过JSON格式的HTTP请求来使用和管理Elasticsearch。
二 Elasticsearch能干什么
- 提供快速查询
试想一下,当你打开一个博客网站,搜索一篇博客的时候,等待了一分钟才有搜索结果,那将会是一个极差的体验。可想而知,这个博客网站肯定没有使用搜索引擎处理搜索的请求,而是使用了传统的关系型数据库查询,在庞大的数据面前,关系型数据库的查询就显得力不从心,相当耗时。Elasticsearch在这个时候可以帮上忙,使用博客数据建立索引库,依赖倒排索引的优势,为用户快速的呈现搜索的相关结果。
- 确保结果的相关性
接下来有一个难题: 如何将真正描述选举的帖子排序在前呢?有了 Elasticsearch,就可以使 用几个算法来计算相关性的得分( relevancy score ),然后根据分数来将结果逐个排序 。
默认情况下,计算文档相关性得分的算法是TF-IDF(term frequency-inverse document frequency),词频逆文档频率。我们将在后面讨论这个概念。除了选择算法,Elasticsearch还提供了很多其他内置的功能来计算概相关性得分,以满足定制需求。
- 超越精确匹配
- 处理错误的拼写
当我们在使用搜索时,会出现英文拼写错误,中文错别字等情况时有发生。我们可以通过配置让Elasticsearch容忍一些错误,而不仅仅只是查找精确匹配。如我们输入“book”的时候由于手误输入了“bok”,如果搜索引擎能够意识到这一错误并且在搜索时帮我们修正这个错误,那么搜索会更快让人满意。
2. 支持变体
这个特性在英文单位搜索时,比较重要,我们搜索一个博客关键词包含“bicycle”的文章,同样可以和“bicylist”或“cycling”的查询匹配上。并且Elasticsearch还有可以将搜索到的关键词加粗上色来凸显。
3.使用统计信息
当用户不太清楚具体要搜索什么的时候,可以通过几种方式来协助他们 。一种方法是聚集统计数据。 聚集是在搜索结果里得到一些统计数据,如每个分类有多少议题、每个分 类中“赞”和“分享”的平均数量。 假想一下,进入博客时,用户会在右侧看见最近流行的议题。 其中之一是自行车。 对其感兴趣的读者会点击这个标题,进一步缩小范围。 然后, 可能还有另外 的聚集方式 ,将自行车相关的帖子分为“ 自行车鉴赏”“自行车大事件”等。
4. 给予自动提示
当用户开始输入时,你可以帮助他们发现主流的查询和结果。 还可以通过自动提示技术预测 他们所要输入的内容,就像 Web 上很多搜索引擎做的那样。 你同样可以展示主流的结果,通过 特殊的查询类型来匹配前缀、通配符或正则表达式。
对于上诉假定的博客系统搜索慢的问题,可以使用Elasticsearch通过如下图所示的架构来优化: