为什么不用MySQL做搜索
假如我们想买一个摄像头是索尼传感器的手机,那我们可能会搜索“索尼传感器”。我们在京东尝试搜索一下:
可以发现,第一个商品实际的描述是:
realme 真我GT 大师探索版 120Hz三星AMOLED曲面屏索尼IMX766传感器骁龙...
如果是数据库的话,SQL 可能是:
select * from product where description like '%索尼传感器手机%';
这样的话很明显是搜不到的,我们需要写一条这样的SQL
select * from product where description like '%索尼%' and description like '%传感器%' and description like '%手机%';
实际情况会比这条SQL更复杂,并且程序不知道怎么拆分“索尼传感器手机”。
所以,MySQL 不能很好的满足这种搜索,类似的搜索也叫全文检索。
什么是全文检索
引用百度
全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文搜索搜索引擎数据库中的数据。
我们举个例子
id | name |
---|---|
1 | 国行苹果手机 |
2 | 韩国三星手机 |
3 | 国产华为手机 |
4 | 罗永浩锤子手机 |
5 | 国产一加手机 |
生成一个索引表如下
keyword | ids |
---|---|
国行 | 1 |
苹果 | 1 |
手机 | 1,2,3,4,5 |
韩国 | 2 |
三星 | 2 |
国产 | 3,5 |
华为 | 3 |
罗永浩 | 4 |
锤子 | 4 |
一加 | 5 |
这时候我们搜索“国产手机”,会把“国产手机”拆分为“国产”和“手机”,我们根据关键词搜索“国产”,得到id是3和5,搜索手机,得到id是1,2,3,4,5。如果要精确匹配,我们返回这两个的交集,是3和5。如果比较模糊的,就返回并集,是1,2,3,4,5,因为3,5出现次数比较多,我们把3,5放在最前面。
这就是全文检索。上面的那张索引表就是倒排索引。
什么是ElasticSearch
简单说,es就是帮助我们更好的管理这些索引数据,并且能很好的支持分布式。
功能
- 分布式搜索引擎和数据分析引擎
- 全文检索,结构化检索,数据分析
- 对海量数据进行近实时的处理
场景
- 百度百科、维基百科
- 新闻网站
- 论坛
- Github
- 电商
- 日志分析
- 商品价格监控
- BI系统6
- ...
特点
- 将全文检索、数据分析、分布式结合在一起
- 开箱即用
- 传统数据库的补充
ElasticSearch的核心概念
Near Realtime(NRT)
近实时。从写入数据到可以被搜索到有一个小延迟,大概1秒。基于es搜索和分析也是秒级。
Cluster
默认支持集群。集群有一个名字,默认是elasticsearch,也可以修改。
Node
集群中的一个节点。节点也有一个名字,默认是随机分配的。
Document
文档,es中的最小数据单元。可以理解为 MySQL 里的行。
通常是Json数据结构。一个document里有多个filed,每个filed就是一个数据字段。
Index
索引,可以理解为MySQL里的库。
Type
类型,每个索引里有多个Type,一个type下的document,都有相同的filed。
type主要是因为有一些相似的document,但filed不一样,就存在不同的type中。
shard
分片
随着业务增加,数据量变大,我只要加机器就行了。
replica
数据副本。其实就是一个备份库。为了保证系统高可用。
主库其实叫primary shard,从库叫replica shard,默认primary shard是5个,replica shard也是5个,原则上是主从在不同的机器,所以最好有两台服务器去部署。