Elasticsearch实战学习笔记系列 Elasticsearch介绍
目录
Elasticsearch实战学习笔记系列 Elasticsearch介绍
系列目录
Elasticsearch实战学习笔记(一) Elasticsearch介绍
Elasticsearch实战学习笔记(二) Elasticsearch环境搭建(Mac Docker)
Elasticsearch实战学习笔记(三) Elasticsearch深入功能
Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据
Elasticsearch实战学习笔记(五) Elasticsearch搜索数据
Elasticsearch实战学习笔记(六) Elasticsearch分析数据
Elasticsearch实战学习笔记(七) Elasticsearch使用相关性进行搜索
Elasticsearch实战学习笔记(八) Elasticsearch文档间的关系
一、什么是搜索引擎
如今,我们无处不在地使用“搜索”。 这是件好事,因为搜索能帮你从容不迫地完成手头上的工作。我们也很期待这些搜索框变得更智能 。
1. 没有必要输入整个词,比如“碗”这个词所需的全部字母(bowl所有四个字母),希望搜索框能有自动提示的功能,而且提示的内容要合理,不能胡乱提示
2.最相关的结果要排在前面,简单来说就是尽可能猜中用户想要什么
3.良好的关键字查询往往还不够,你还需要从搜索结果中得到一些统计信息,并利用其定位用户的兴趣。
4.性能问题 快速得到结果
Elasticsearch是构建在 Apache Lucene之上的开源分布式搜索引擎。 Lucene是开源的搜索引擎包,允许你通过自己的Java应用程序实现搜索功能。Elasticsearch充分利用 Lucene,并对其进行了扩展,使存储、索引、 搜索都变得更快、更容易, 而最重要的是, 正如名字中的 “elastic” 所示, 一切都是灵活、 有弹性的。 而且,应用代码也不是必须用Java书写才可以和 Elasticsearch 兼容,你完全可以通过 JSON 格式 的 HTTP 请求来进行索引、搜索和管理 Elasticsearch集群 。
二、用 Elasticsearch 解决搜索问题
让我们先看一个示例。 假设你正在搭建一个博 客网站,并且希望用户可以在全站搜索特定的帖子。
需求: 完成的第一项任务就是实现基于关键词的搜索。 例如一位用户查询“选举”,系统需要返回所有包含这个关键词的帖子
健壮的搜索功能:
- 引擎可以快速地返回查询结果 ,而且这些结果都是相关的
- 当用户并不清楚具体要用|哪些词来查找时,搜索还能提供辅助的功能,用于实现更佳的用户体验。具体包括识别错误的输入 ,给出自动提示,并对结果进行分类 。
1.提供快速的查询
Elasticsearch恰好能帮上忙, 因为它是采用 Lucene作为底层的。 Lucene是个高性能的搜索引擎包, 默认情况下会将所有的数据全部进行索引 。Lucene 使用的是倒排索引, 这意味着它将创建一个数据结构,并在其中保存记录每个单词出现在哪些数据中的清单
只需要查看标签是 elections 这一栏,然后获得相应所有的文章 ID (这里是 1 和 3 )。 在搜索引擎的应用场景下,这种速度的提升是非常必要的 。 在现实世界中,你基本不会只查询 1 个关键词 。 例如,如果搜“Elasticsearch in Action", 3 个词就意味着查询速度提升了3倍 。
相关性优势
- 当查找 “peace”(和平)这样的单词时,你不仅可以看到哪些文档是匹配的,还能免费获得这些文档的总数
- 搜索的“Elasticsearch in Action”时,有个文档包括“in”这个单同(当然还有上百万个文档也包括“in”)。 你会意识到“in”是个常见词,即使这个文档因为包含“in”而匹配成功,也不代表它和查询有多相关。如果这个文档包含“Elasticsearch” 你就知道离相关文档不远了
2.确保结果的相关性
难题: 如何将真正描述选举的帖子排序在前呢?
有了 Elasticsearch,就可以使用几个算法来计算相关性的得分(relevancy score),然后根据分数来将结果逐个排序。默认情况下,计算文档相关性得分的算法是 TF-IDF(term frequency-inverse document frequency, 词频-逆文档频率),两个重要因素
- 词频 查找的单词在文档中出现的次数越多,得分越高
- 逆文档词频 如果某个单词在所有文档中比较少见,那么该词的权重越高,得分也会越高
除了选择算法, Elasticsearch 还提供了很多其他内置的功能来计算相关性得分,以满足定制需求。 例如,你可以“提升”特定宇段的得分:从相关性的角度考虑,帖子的标题比文章主体更为重要 。这样标题上相匹配的文档会 比仅仅在主体中匹配上的文档获得更高的分数 。 你也可以让精确匹配比部分匹配获得更高的分数,甚至通过脚本添加定制条件来改变得分的计算。 例如,如果帖子允许用户点赞,可以根据点赞数来提升得分,或者让新的帖子获得更高得分,排在较旧的帖子之前。
3.超越精确匹配
(1)处理错误的拼写
可以通过配置 ,让 Elasticsearch容忍一些变化使用模糊查询 ,"bicycel"的输入同样可以让用户找到关于"bicycles"的博客
(2)支持变体
标题里包含“bicycle”的 帖子,同样可以和“bicyclist”或“cycling”的查询匹配上
(3)使用统计信息
聚集是在搜索结果里得到一些统计数据,如每个分类有多少议题、每个分 类中“赞”和“分享”的平均数量。 假想一下,进入博客时,用户会在右侧看见最近流行的议题。 其中之一是自行车,对其感兴趣的读者会点击这个标题,进一步缩小范围。 然后可能还有另外的聚集方式 ,将自行车相关的帖子分为“ 自行车鉴赏”“自行车大事件”等。
(4)给予自动提示
当用户开始输入时,你可以帮助他们发现主流的查询和结果。 还可以通过自动提示技术预测他们所要输入的内容,就像 Web 上很多搜索引擎做的那样。 你同样可以展示主流的结果,通过特殊的查询类型来匹配前缀、通配符或正则表达式。
三、探索典型的Elasticsearch使用案例
1.将 Elasticsearch 作为主要的后端系统
一般实际项目不太会这么做. Elasticsearch是一个现代搜索引擎,提供了持久化存储、统计和很多其他数据存储的特性。 如果正在启动一个新项目,我们建议你考虑使用 Elasticsearch作为唯一的数据存储,尽量使设计保持简洁。
2.将 Elasticsearch 添加到现有的系统
你已经有一个复杂的系统在运作,但是想加入搜索功能。如果只是为了使用 Elasticsearch 而重新设计整个系统,那么未免太冒险了。 更安全的方法是在系统中加入 Elasticsearch,让它和现有模块协同工作 。
如果你有两个数据存储,必须想方设法保持它们的同步。 根据主要数据存储是什么类型的,以及数据是如何布局规划的,可以部署一个 Elasticsearch插件,保持两者同步.
3.将 Elasticsearch 和现有工具一同使用
在某些用例中,无须编写任何代码,就能让 Elasticsearch 帮你将任务搞定 。 很多现成的工具可以和 Elasticsearch 协同 工作,没有必要从头开始 。
例如像部署大规模日志框架,用于储存、搜索和分析海量日志,可以使用ELK框架
四、Elasticsearch特性
- 轻松地使用 Lucene 的索引功能,并搜索数据. 在搜索的时候,有很多查询和过滤器供选择, 让用户可以构建 JSON格式的查询、 调整大多数的配置。
- EIasticsearch添加了其自己的高级功能,从缓存到实时性分析
- 另一种抽象层次是组织文档的方式,可以多个索引可以单独搜索、也可以同时搜索,还可以将不同类型的文档放入不同的索引
- 具有灵活性的,默认它就是集群化的(即使是在单台服务器上运行,也称之为集群),并且总是可以添加更多的服务器用于增加容量或容错性。 类似地,如果负载较低的时候,可以很容易地从集群中移除服务器,降低成本
系列目录
Elasticsearch实战学习笔记(一) Elasticsearch介绍
Elasticsearch实战学习笔记(二) Elasticsearch环境搭建(Mac Docker)
Elasticsearch实战学习笔记(三) Elasticsearch深入功能
Elasticsearch实战学习笔记(四) Elasticsearch索引、更新和删除数据
Elasticsearch实战学习笔记(五) Elasticsearch搜索数据
Elasticsearch实战学习笔记(六) Elasticsearch分析数据
Elasticsearch实战学习笔记(七) Elasticsearch使用相关性进行搜索
Elasticsearch实战学习笔记(八) Elasticsearch文档间的关系