一、Elasticsearch 印象
分布式、全文检索、数据分析。
二、为什么不用传统关系型数据库,如 MySQL,做搜索
举个反例。假设有以下数据库表 t_game:
id | name |
---|---|
1 | 唐僧取经 |
2 | 西天取经 |
3 | 唐僧不取经 |
需求:你在搜索输入框中输入 “唐僧取经”,希望找出相关的游戏。
转化成 SQL 就是:SELECT * FROM t_game where name LIKE '%唐僧取经%';
LIKE 前后模糊匹配,不走索引,只能全表扫描,数据量很大的话,比如有个 1 千万条记录,就需要扫描 1 千万次,性能肯定很差。
还有一个问题,当你搜索 “唐僧取经” 的时候,也许 “唐僧不取经” 也是你想要的结果,
但是 SQL 查询无法匹配这条记录。
所以,用关系型数据库做搜索,有两大问题:① 全表扫描,性能不好 ② 只能把输入关键字作为一个整体,也就是不能全文检索。
三、全文搜索 和 倒排索引
利用一种叫做 “倒排索引” 的东东,大致原理:
把 t_game 表的 name 字段进行分词,然后记录分出来的词对应的 id
分词 | ids |
---|---|
取经 | 1、2、3 |
唐僧 | 1、3 |
西天 | 2 |
不 | 3 |
然后,对搜索关键字 “唐僧取经” 也进行分词:唐僧、取经。
第一次拿 “唐僧” 去查倒排索引,可以查到游戏 id 为:1、3 的记录;接着用 “取经” 再去查倒排索引,
可以查到游戏 id 为:1、2、3 的记录,合并结果就是返回 1、2、3 的记录。
在本例中,即使数据有千千万,只需要 2 次查询,就可以查到所有结。
所以,利用 倒排索引,可以解决两个问题:全文搜索、性能问题。
四、lucene
简单来说就是一个 jar 包,封装了建立 倒排索引 的算法,已经各种 搜索 算法,可以用来做全文检索。
五、Elasticsearch
lucene 虽然可以做全文检索,
但是只能单机,不能集群,当数据量太大以致单机无法容纳,需要分布式处理时,处理起来很麻烦;
也不能做复杂的数据分析。
于是顺其自然的就有了 Elasticsearch,Elasticsearch 可以分布式集群,并且可以做一些复杂的数据分析,而且高可用,
当一些节点挂掉后,还能正常对外服务。