其实 ES 说白了,就是一个专门用来做搜索的工具。我们平时用的 MySQL,它的本职工作是存数据、查数据、做业务增删改查。但它非常不擅长「全文搜索」。举个很直观的例子:如果数据库里有几万条古籍、诗词、文章数据,你想用 MySQL 的模糊查询搜一个关键词,它的逻辑就是从头到尾遍历所有数据,一条条比对,数据量一大,速度就会变得巨慢,而且搜出来的结果乱七八糟,没有优先级。而 Elasticsearch 就是专门为了解决这个痛点诞生的。它底层帮我们提前做好了分词、建好倒排索引。别人搜关键词的时候,它不用遍历全部数据,直接查表匹配,所以搜索速度特别快,基本上都是毫秒级响应。
接下来再讲讲es中的相关概念
1、索引(Index)
你可以直接把它理解成 MySQL 里的一张数据表。我要存古籍数据,就建一个古籍索引;我要存诗词数据,就建一个诗词索引。同一类的数据,统一放在一个索引里面管理。
2、文档(Document)
文档就是 ES 里最小的一条数据,对应 MySQL 表里的一行数据。一本古籍、一首诗词、一条资讯,在 ES 里都叫一个文档,格式就是 JSON,里面包含标题、内容、作者这些字段。
3、分片与副本
如果我的数据量超级大,一台服务器存不下、也扛不住压力,怎么办?
ES 就会把大的索引拆开,分成好几份「主分片」,分散放到不同服务器上。同时还会备份几份「副本分片」,万一某一台机器挂了,备份能直接顶上,保证数据不丢、服务不崩,这就是 ES 分布式、高可用的优势。这里有一个超级形象的图
4、相关性得分(score)
这也是 MySQL 做不到的一点。我们搜索一个关键词,有的文章匹配度高、关键词多,有的匹配度低。ES 会自动给每一条结果打分,匹配越贴合分数越高,排在最前面,搜出来的结果特别贴合用户需求。
简单总结一下:
MySQL 适合老老实实存业务数据,做增删改查;Elasticsearch 专门负责高性能、高质量的全文搜索。所以在做项目的时候,我会选择用 MySQL 做主数据存储,配合 Elasticsearch 实现全站的全文检索功能,解决大数据量下搜索卡顿、匹配效果差的问题。