一、了解为什么要使用分布式搜索引擎
1.对于了解到这一步的开发者来说,我们应该都知道了我们要寻找的数据会在哪里存放着,但是数据库的查询能力并不能满足我们在大量的数据源中搜寻数据时的要求,那么也就理所当然的引出了该类分布式搜索引擎的出现。
1.1接着我们就需要对分布式搜索引擎有一个具体的了解。这里主要是针对es因为现在目前的分布式搜索引擎中它位列第一。那么就要从它的优缺点来进行了解了。
优点:它支持分词搜索,具有高性能和高扩展性。这样的优势可以让我们大量的将电商售卖的物品可以存放到其中后,让使用者可以在搜索栏中快速的通过关键词找到自己的心仪的商品,这也是我下意识认为它会用到什么地方合适。
缺点:它是基于机器的内存而使用的,所以这就导致了一个问题,那就是使用它的成本要远比传统的数据库要烧钱,所以要综合考虑你的数据量和你的程序对于查询的要求,同时由于是一个新的引擎需要学习它的相关知识,提升了开发复杂度,最后是运维方面的成本。
数据库:
MySQL:关系型数据(Oracle,Sql Server)
Mongodb、ES、Redis:非关系型数据 nosql(not only sql)
选型注意事项:
1、如果数据库分表之后需要进行事务管理 - MySQL
2、数据量特别大,而且不是核心业务 - MongoDB
3、数据量大,分词查询 - elasticsearch
二、es和核心理念
2.1正向索引
什么是正向索引呢:就是我们在数据库中有一个表时我们会根据id查询,这样的查询过程还是非常快的。但是我们要是使用数据库中相应的字段查询那么它的效率就会慢上非常多。原因就是它需要遍历所有的数据的每一个整行例如搜索 %手机% 那么需要将每一行中的数据遍历对照,如若该行数据中有符合要求的字段,它将该行数据放入到结果集中,若不符合就继续向下对照直到将数据遍历完成,这个过程当数据到达一定的数量后是十分花费时间的这也是我们要引入es的原因。
2.2倒排索引
首先在了解到正向索引后我们要和其对应着看倒排索引。在正向索引中我们的数据是一条一条的而在倒排索引中这样的一条数据被称为一个文档,可以简单的理解成为一条数据,例如一个网页、一个商品信息。接着正向索引中的字段就是Title在倒排索引中它更倾向被理解为一个词条(Term)而我们在搜索时,就是根据这些词条进行搜索。而这些词条被分开后会形成类似hash的结构即每一个词条对应多个id。这是我们会在进行查找时远超数据库查询速度的关键,它这样的结构会使得每一个词条对应多个id这样根据词条就可以快速找到该词条对应的id这样数据就被找出来了。
2.3区别
正向索引:是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。
优点:可以给多个字段创建索引;根据索引字段搜索、排序速度非常快
缺点:根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
倒排索引:则相反,是先找到用户要搜索的词条,根据词条得到保存词条的文档的id,然后根据id获取文档。是根据词条找文档的过程。
优点:根据词条搜索、模糊搜索时,速度非常快
缺点:只能给词条创建索引,而不是字段;无法根据字段做排序
三、ES和MYQSL
1.3.3.mysql与elasticsearch
我们统一的把mysql与elasticsearch的概念做一下对比:
MySQL | Elasticsearch | 说明 |
---|---|---|
Table | Index | 索引库(index),就是文档的集合,类似数据库的表(table) |
Row | Document | 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
SQL | DSL | DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
是不是说,我们学习了elasticsearch就不再需要mysql了呢?
并不是如此,两者各自有自己的擅长支出:
Mysql:擅长事务类型操作,可以确保数据的安全和一致性
Elasticsearch:擅长海量数据的搜索、分析、计算
因此在企业中,往往是两者结合使用:
对安全性要求较高的写操作,使用mysql实现
对查询性能要求较高的搜索需求,使用elasticsearch实现
两者再基于某种方式,实现数据的同步,保证一致性。
以上就是对于es的介绍了,如若出现使用中的问题联系作者虽然不一定能解决,但免费O(∩_∩)O哈哈~。