为什么不用MySQL做搜索

假如我们想买一个摄像头是索尼传感器的手机,那我们可能会搜索“索尼传感器”。我们在京东尝试搜索一下:
image.png
可以发现,第一个商品实际的描述是:

realme 真我GT 大师探索版 120Hz三星AMOLED曲面屏索尼IMX766传感器骁龙…

如果是数据库的话,SQL 可能是:

  1. select * from product where description like '%索尼传感器手机%';

这样的话很明显是搜不到的,我们需要写一条这样的SQL

  1. 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就是帮助我们更好的管理这些索引数据,并且能很好的支持分布式。

功能

  1. 分布式搜索引擎和数据分析引擎
  2. 全文检索,结构化检索,数据分析
  3. 对海量数据进行近实时的处理

    场景

  4. 百度百科、维基百科

  5. 新闻网站
  6. 论坛
  7. Github
  8. 电商
  9. 日志分析
  10. 商品价格监控
  11. BI系统
  12. 特点

  • 将全文检索、数据分析、分布式结合在一起
  • 开箱即用
  • 传统数据库的补充