• 0
  • 0
分享
  • 轻松理解ES(elasticsearch)搜索引擎(图)——软件测试圈
  • 曼倩诙谐 2022-03-11 13:01:27 字数 1605 阅读 1145 收藏 0

  我们在开发测试过程中是不是常常会因为查询效率低下而感到苦恼?

  把数据都存在数据库中,通过建立索引可以提高数据查询效率,但是如果我们查找的数据索引无法生效,数据库一条一条的判断效率又得不到提升。

  这里我们给大家介绍一种能够在大数据量下提高查询效率的方法ES(elasticsearch)搜索引擎,接下来我们从什么是搜索、普通搜索面临的问题和ES如何解决这些问题这几个方面,让大家快速理解ES搜索引擎。

  什么是搜索

  简单的说搜索就是我们在搜索框输入关键词,查找哪些网页包含对应的关键词的过程。

  例如:用户在搜索框输入一个词,客户端软件发送一个请求到后台,后台通过sql语句从数据库中找出相关条目(数据库会一条一条对比),这就是一个最简单搜索原型。

  普通搜索面临的问题

  1、当网页很多时,假如1000万个网页呢,即使服务器的性能足够快,从用户角度,从点击搜索按钮到看到搜索结果可能要很长时间,1小时?2小时?甚至好几天?

  2、当数据量达到几十T,一台服务器已经放不下了,这时候就需要多台,这就是分布式。

  这时候数据就在不同的服务器了,一个客户端不可能去请求每台机器,所以就需要一个管理员角色,负责把客户端请求分发到每台机器,同时汇总结果返回给客户端。

  ES搜索引擎如何解决这些问题

  建立倒排索引

  正向的查找数据需要消耗大量的时间,我们可否反过来进行存存储呢,现在我们有很多网页,如何才能快速的查到对应的网页呢?

  我们知道哈希表的查找效率特别快,借鉴一下哈希表,我们给每个网页都打上标签,每个标签和对应的网页建立对应的映射,我们通过标签与网页的映射关系就可以马上找到对应的网页了。

  首先把所有的原始数据进行编号,形成文档列表如图1:

1-1.png

图1 原始数据进行编号

  其次,把文档数据进行分词,得到很多的词条,以词条为索引。

  保存包含这些词条的文档的编号信息,如图2:

1-2.png

图2 分词与原始数据对应关系

  当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。

  分布式的实现

  Elasticsearch 也是会对数据进行切分,同时每一个分片会保存多个副本,其原因是为了保证分布式环境下的高可用。

  在 ES中,节点是对等的,节点间会通过自己的一些规则选取集群的 Master,Master 会负责集群状态信息的改变,并同步给其他节点。

  值得注意的是,只有建立索引和类型需要经过 Master,数据的写入有一个简单的 Routing 规则,可以 Route 到集群中的任意节点,所以数据写入压力是分散在整个集群的。

  Elasticsearch 建立一个索引,这个索引可以拆分成多个 shard,每个 shard 存储部分数据。

  这个shard 的数据实际是有多个备份,就是说每个 shard 都有一个 primary shard,负责写入数据,但是还有几个 replica shard。

  primary shard 写入数据之后,会将数据同步到其他几个 replica shard 上去,如图3,通过这个 replica 的方案,每个 shard 的数据都有多个备份,如果某个机器宕机了,还有别的数据副本在别的机器上。

1-3.png

图3分布式搜索引擎架构图

  总结

  本文从什么是搜索、普通搜索面临的问题和ES如何解决这些问题这几个方面,让大家快速理解ES搜索引擎。

  ES通过倒排索引提高了大数据下的数据查询效率,通过分布式的方式实现了大数据的存储与系统的高可用,采用ES搜索引擎可满足大数据量下的数据查询场景,利用现有的框架可极大地缩小开发成本,提升用户的使用体验。



作者:崔岢   

来源:http://www.51testing.com/html/62/n-4481562.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   虽然产品同学都知道要站在用户的角度设计产品,但事实是部分同学设计出来的产品真的是一言难尽,很多产品甚至只停留在将功能转换为原型图、流程图的层面。难道交互性强、用户体验好的产品都是别人家的?提高用户体验虽然是产品一贯的目标和宗旨,但是不同的实践方法和实现路径阻碍了好的产品设计。结合看了《用户体验多面手》的感想以及项目中的经历,总结了产品同学比较容易忽略的情况。  1、仅限于自己站在用户的角度,忽略了用户调研  他们知道要从用户的角度出发,思考如何设计一款满足用户需求的产品,但仅仅这样是不够的。每个人的想法都有局限性,给十个产品各自按照自己的偏好设计一款旅游app,得到的结果也是不尽相同的,那...
            0 0 947
            分享
          • 一、前言618期间上线一个活动项目。但上线不顺利,当天就出现了性能问题,接口超时,用户无法打开网页,最后不得的临时下线。花了三天两夜,重构了后台核心代码,才让活动进行下去。回头看了一下自己的时间记录,从5月31号那天晚上8点25分开始准备上线,发现异常,分析原因,重构代码,离开公司时已经是6月2号的23点54,经历51小时29分,中间的睡眠时间不到5个小时,这已经是爆发小宇宙了。这一波刚过去了,一波未平另一波又起,由于活动的奖励丰厚,大批羊毛党闻风而至,某宝上公开卖脚本的都有了,严重影响了正常用户薅羊毛。某客户反馈说:我们别说薅羊毛了,现在是整头羊都被他们牵走了!接下来的几天,又得和薅羊毛的脚...
            14 14 1013
            分享
          • 在以往性能测试中,通常施压机的硬件资源不会成为压力瓶颈,但是在多任务并行的场景中,如果一个任务占用当前机器资源过多,会影响其他任务执行。或者当前用例本身存在问题,导致性能无法进一步提升,影响了性能测试执行。根据以上场景,如果能从监控工程上得到解决自然是最好的。可以实时监控施压机和施压进程的CPU占用、内存使用、GC清空。但是,重点来了,并不是总能拥有一套完美的监控系统。这个时候,就需要自己手动解决一些痛点。经过查阅资源,最终将方案锁定在java.lang.management.ManagementFactory这个类,看名字和路径大概能猜个七七八八了。以上我提到的信息都可以调用这个类的API获...
            0 0 997
            分享
          • Docker ComposeCompose 简介Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。Compose 使用的三个步骤:使用 Dockerfile 定义应用程序的环境。使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。最后,执行 docker-compose up 命令来启动并运行整个应用程序。Compose 安装LinuxLinux 上我们可以从 Github 上下载它...
            11 11 5790
            分享
          •   1.知道为什么要测试  执行渗透测试的目的是什么?是满足审计要求?是你需要知道某个新应用在现实世界中表现如何?你最近换了安全基础设施中某个重要组件而需要知道它是否有效?或者渗透测试根本就是作为你定期检查防御健康的一项例行公事?  当你清楚做测试的原因时,你也就知晓自己想从测试中得到什么了,而这可以让测试规划工作更有效率。知道做测试的缘由可以让人恰当地确立测试的范围,确定测试结果将会揭露什么问题。  或许这一步中最重要的一部分,是让团队提前架设好准备从测试结果中得出正确的结论的心理预期。如果测试是要审查IT基础设施的某个特定方面(比如说新的Web应用),那就没必要着墨于公司整体安全。理解做测...
            13 13 1192
            分享
      • 51testing软件测试圈微信