我们在开发测试过程中是不是常常会因为查询效率低下而感到苦恼?
把数据都存在数据库中,通过建立索引可以提高数据查询效率,但是如果我们查找的数据索引无法生效,数据库一条一条的判断效率又得不到提升。
这里我们给大家介绍一种能够在大数据量下提高查询效率的方法ES(elasticsearch)搜索引擎,接下来我们从什么是搜索、普通搜索面临的问题和ES如何解决这些问题这几个方面,让大家快速理解ES搜索引擎。
什么是搜索
简单的说搜索就是我们在搜索框输入关键词,查找哪些网页包含对应的关键词的过程。
例如:用户在搜索框输入一个词,客户端软件发送一个请求到后台,后台通过sql语句从数据库中找出相关条目(数据库会一条一条对比),这就是一个最简单搜索原型。
普通搜索面临的问题
1、当网页很多时,假如1000万个网页呢,即使服务器的性能足够快,从用户角度,从点击搜索按钮到看到搜索结果可能要很长时间,1小时?2小时?甚至好几天?
2、当数据量达到几十T,一台服务器已经放不下了,这时候就需要多台,这就是分布式。
这时候数据就在不同的服务器了,一个客户端不可能去请求每台机器,所以就需要一个管理员角色,负责把客户端请求分发到每台机器,同时汇总结果返回给客户端。
ES搜索引擎如何解决这些问题
建立倒排索引
正向的查找数据需要消耗大量的时间,我们可否反过来进行存存储呢,现在我们有很多网页,如何才能快速的查到对应的网页呢?
我们知道哈希表的查找效率特别快,借鉴一下哈希表,我们给每个网页都打上标签,每个标签和对应的网页建立对应的映射,我们通过标签与网页的映射关系就可以马上找到对应的网页了。
首先把所有的原始数据进行编号,形成文档列表如图1:
图1 原始数据进行编号
其次,把文档数据进行分词,得到很多的词条,以词条为索引。
保存包含这些词条的文档的编号信息,如图2:
图2 分词与原始数据对应关系
当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。
分布式的实现
Elasticsearch 也是会对数据进行切分,同时每一个分片会保存多个副本,其原因是为了保证分布式环境下的高可用。
在 ES中,节点是对等的,节点间会通过自己的一些规则选取集群的 Master,Master 会负责集群状态信息的改变,并同步给其他节点。
值得注意的是,只有建立索引和类型需要经过 Master,数据的写入有一个简单的 Routing 规则,可以 Route 到集群中的任意节点,所以数据写入压力是分散在整个集群的。
Elasticsearch 建立一个索引,这个索引可以拆分成多个 shard,每个 shard 存储部分数据。
这个shard 的数据实际是有多个备份,就是说每个 shard 都有一个 primary shard,负责写入数据,但是还有几个 replica shard。
primary shard 写入数据之后,会将数据同步到其他几个 replica shard 上去,如图3,通过这个 replica 的方案,每个 shard 的数据都有多个备份,如果某个机器宕机了,还有别的数据副本在别的机器上。
图3分布式搜索引擎架构图
总结
本文从什么是搜索、普通搜索面临的问题和ES如何解决这些问题这几个方面,让大家快速理解ES搜索引擎。
ES通过倒排索引提高了大数据下的数据查询效率,通过分布式的方式实现了大数据的存储与系统的高可用,采用ES搜索引擎可满足大数据量下的数据查询场景,利用现有的框架可极大地缩小开发成本,提升用户的使用体验。
作者:崔岢