共计 1634 个字符,预计需要花费 5 分钟才能阅读完成。
- 官腔
Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统
基本等于没说, 咱们慢慢看
1 概述
百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条感兴趣的新闻(提到搜索的第一印象)
百度 != 搜索,这是不对的
垂直搜索(站内搜索)
- 互联网的搜索:电商网站,招聘网站,新闻网站,各种 app
- IT 系统的搜索:OA 软件,办公自动化软件,会议管理,日程管理,项目管理,员工管理,搜索“张三”,“张三儿”,“张小三”;有个电商网站,卖家,后台管理系统,搜索“牙膏”,订单,“牙膏相关的订单”
搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,然后就期望找到这个关键字相关的有些信息
2 数据库搜索
数据都是存储在数据库里面的
很自然的,如果从技术的角度去考虑,如何实现搜索,电商网站内部的搜索功能的话,就可以考虑,去使用数据库去进行搜索。
2.1 案例 – 电商系统的搜索
- 搜索含有牙膏的商品
- 在数据库中商品名称字段中存储有关键字
数据库来处理的话,不考虑数据库的全文索引什么的,假如商品有 1000 万 个,那么基本上就要查找 1000 万次,且每次都需要加载商品的名称字段的整段字符串,并挨个寻找。
- 每条记录的指定字段的文本,可能会很长
比如“商品描述”字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的所有文本进行扫描,懒判断说,你包不包含我指定的这个关键词(比如说“牙膏”)
- 无法将搜索词拆分开来
尽可能去搜索更多的符合你的期望的结果,比如输入“生化机”,就搜索不出来“生化危机”
用数据库来实现搜索,是不太靠谱的。通常来说,性能会很差的。
3 全文检索 & Lucene
3.1 全文检索
3.1.1 场景:搜索“生化机”
- 全文检索
(有可能是手抖打错了,本来是生化危机),但是期望需要出来右侧的 4 条 记录
有 4 条 数据
将每条数据进行词条拆分。如“生化危机电影”拆成:生化、危机、电影 关键词(拆分结果与策略算法有关)
每个关键词将对应包含此关键词的数据 ID
搜索的时候,直接匹配这些关键词,就能拿到包含关键词的数据
这个过程就叫做全文检索。而词条拆分和词条对应的 ID 这个就是倒排索引的的基本原理
对比数据库的缺陷
数据库里的数据,共有 100 万条, 按照之前的思路, 其实就要扫描 100 万次,而且每次扫描, 都需要匹配那个文本所有的字符,确认是否包含搜索的关键词,而且还不能将搜索词拆解开来进行检索
利用倒排索引
进行搜索的话,假设 100 万条数据, 拆分出来的词语, 假设有 1000 万个词语,那么在倒排索引中, 就有 1000 万行, 我们可能并不需要搜索 1000 万次。
很可能说, 在搜索到第一次的时候, 我们就可以找到这个搜索词对应的数据。
也可能是第 100 次, 或者第 1000 次
3.2 lucene
就是一个 jar 包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法
java 开发的时候,引入 lucene jar,然后基于 lucene 的 API 进行去进行开发就可以了
用 lucene,我们就可以去将已有的数据建立索引,lucene 会在本地磁盘上面,给我们组织索引的数据结构
另外的话,我们也可以用 lucene 提供的一些功能和 API 来针对磁盘上额
4 Elasticsearch 的意义
我们可以使用 lucene 开发搜索服务,部署在一台机器上面,但是无法解决当数据量增大的时候出现的问题(图上右侧)。
那么 elasticsearch 就是解决这种场景的工具;
- 自动维护数据的分布到多个节点的索引建立、检索请求分布到多个节点的执行
- 自动维护数据的冗余副本,保证一些机器宕机了,不会丢失任何数据
- 封装了更多的高级功能
- 给我们提供更多高级的支持,让我们快速的开发应用,开发更加复杂的应用
- 复杂的搜索功能,聚合分析的功能,基于地理位置的搜多(距离我当前位置 1 公里 以内的烤肉店)
参考
- 搜索引擎
- [Elasticsearch 顶尖高手系列]
本文由博客一文多发平台 OpenWrite 发布!