为什么不用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就是帮助我们更好的管理这些索引数据,并且能很好的支持分布式。
功能
- 将全文检索、数据分析、分布式结合在一起
- 开箱即用
- 传统数据库的补充