ElasticSearch关键概念教程(更新中)
文章目录
- ElasticSearch关键概念教程(更新中)
- 应用场景
- Index(待更新)
- Mapping(待更新)
- Document(待更新)
应用场景
这是一个专业的搜索引擎,请务必将其与MySQL等关系型数据库分开看待和了解。
如果要举一个例子让你对ES有一个清晰的认知,你可以参考百度、Google搜索引擎的搜索功能:
可以看到,当你搜索武汉科技大学这个关键字之后显示的结果,所有含有“武汉科技大学”的内容都被标红并展示给你了。
接下来是重点:
假设你写了一个模仿小红书的Web应用,你想提供一个搜索接口,通过获取到用户传给后端的关键词(例如:“武汉科技大学”)来搜索特定内容,按照普通开发者的想法,你也许会轻而易举地想到使用MySQL的LIKE去数据库中模糊匹配或者精确匹配。
但是,这样会出现一个严重的问题:效率低下——因为这必然导致你的查询语句会进行全表扫描——你不可能为每一列创建一个索引,更何况你还可能在文章内容中查询“武汉科技大学”这个关键字(更何况还要考虑查询短语/句子的情况),文章的内容是不可能作为索引供你查询,这样导致的结果必然就是逐条甚至于逐字逐句地去匹配你查询的内容。
当然,你也不要简单地就以为ES就是个查询关键字的数据库,它支持将你的查询文本进行拆分之后再查询,而不是简单地将你的查询文本作为一个整体去查询包含这个文本的数据,例如,当你搜索“武汉科技大学计算机学院”时,搜索引擎对你的查询文本进行了拆分(这个行为就被称作“分词”),变成了“武汉科技大学”、“计算机”、“学院”、“武汉科技大学计算机学院”等等不同的不可拆分且有意义的词句进行查询。
那么,ES是如何达到上述的效果的呢?
答案是:倒排索引。
首先,我们知道,MySQL数据存储是基于正向索引(即不破坏数据的整体性的前提下存入数据库)的,下面给一个例子:
| id | title |
|---|---|
| 1 | 武汉科技大学 |
| 2 | 武汉大学 |
| 3 | 华中科技大学 |
[1,武汉科技大学],[2,武汉大学] 等都是一个整体,我们暂且称呼其为“文档”,如果你要查询“大学”关键字,使用LIKE '%大学%'去每一个文档中模糊匹配,你只能遍历每一条数据中的每一条title的每一个字,如果满足条件,则放入结果集。
那么,什么是倒排索引呢?
上述正向索引我们可以看到是根据文档查找关键字,最后再确定这个文档是否包含你要查找的关键字,而倒排索引不一样,它是根据关键字直接查找到文档。
如何通过正向索引构建出倒排索引?可以看见,把所有文档中的“title”拿出来进行“分词”(即对句子/短语拆分为再也无法分割的关键字,也就是词条),然后将每个词条作为索引,构建出词条与文档的对应关系(即这个词条哪些文档中有)。
| term(词条) | id(文档id) |
|---|---|
| 武汉 | 1,2 |
| 科技 | 1,3 |
| 大学 | 1,2,3 |
| 华中 | 1 |
这样,当你查询“大学”关键字的时候,你可以直接根据倒排索引构建出的映射关系得知再文档1,2,3中包含“大学”关键字,随后直接返回结果集,而不需要再遍历文档了,这样是不是快多了?
这是我在阿里云开发者社区上找的一张图,介绍了正向索引和倒排索引构建的数据关系谁占据主体地位以及他们之间最重要的区别:
好啦,在简单介绍了正向索引和倒排索引之后想必你对ES就有了一个大体上的理解:这是一个专门用于搜索服务的数据库,是为你的web服务构建搜索功能的首选。
Index(待更新)
相当于MySQL中的表
Mapping(待更新)
相当于MySQL中的表结构
Document(待更新)
相当于MySQL中的表中数据