• 黑马Java热门面试题Monngo&ES(十)



    目录:

    (1)MongoDB 的优势有哪些?

    (2)MongoDB 与 MySQL 的区别是什么?

    (3)MongoDB 中概念有哪里与 MySQL 不一样的?

    (4)MongoDB 文档的 Objectld 由什么构成?

    (5)mongodb 数据为什么会丢失?

    (6)ES 索引体系包含哪些内容?

    (7)ES 为什么这么快(什么是倒排索引)?

    (8)ES 的索引是什么?

    (9)ES 中字符串类型有几个?区别是什么?

    (10)ES 中 query 和 filter 的区别?

    (11)如何解决 ES 集群的脑裂问题

    (12)ES 索引数据多了怎么办,如何调优,部署?

    (13)详细描述一下 ES 搜索的过程?

    (14)详细描述一下 ES 索引文档的过程?


    (1)MongoDB 的优势有哪些?

    • 面向文档的存储:以 JSON 格式的文档保存数据

    • 任何属性都可以建立索引

    • 高性能及高可扩展性

    • 自动分片

    • 丰富的查询功能

    • 快速的即时更新

    (2)MongoDB 与 MySQL 的区别是什么?

    mongodb 的本质还是一个数据库产品,3.0 以上版本其稳定性和健壮性有很大提升。 它与 mysql 的区别在于它不会遵循一些约束,比如:sql 标准、ACID 属性,表结构 等。其主要特性如下:

    • 面向集合文档的存储:适合存储 Bson(json 的扩展)形式的数据;

    • 格式自由,数据格式不固定,生产环境下修改结构都可以不影响程序运行;

    • 强大的查询语句,面向对象的查询语言,基本覆盖 sql 语言所有能力;

    • 完整的索引支持,支持查询计划;

    • 支持复制和自动故障转移;

    • 支持二进制数据及大型对象(文件)的高效存储;

    • 使用分片集群提升系统扩展性;

    • 使用内存映射存储引擎,把磁盘的 IO 操作转换成为内存的操作;

     (3)MongoDB 中概念有哪里与 MySQL 不一样的?

     (4)MongoDB 文档的 Objectld 由什么构成?

    • 时间戳

    • 客户机 ID

    • 客户端进程 ID

    • 3 字节递增计数器

    (5)mongodb 数据为什么会丢失?

     (6)ES 索引体系包含哪些内容?

    (7)ES 为什么这么快(什么是倒排索引)?

     • 倒排索引是搜索引擎的核心。搜索引擎的主要目标是在查找发生搜索条件的文 档时提供快速搜索。倒排索引是一种像数据结构一样的散列图,可将用户从单 词导向文档或网页。它是搜索引擎的核心。其主要目标是快速搜索从数百万文 件中查找数据。

    • 传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置。而倒排索引, 是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表即为倒排索 引。有了倒排索引,就能实现 o(1)时间复杂度的效率检索文章了,极大的提 高了检索效率。 要注意倒排索引的两个重要细节: • 倒排索引中的所有词项对应一个或多个文档

    • 倒排索引中的词项 根据字典顺序升序排列

    (8)ES 的索引是什么?

    • 索引(名词): 一个索引(index)就像是传统关系数据库中的数据库,它是相关 文档存储的地方,index 的复数是 indices 或 indexes。

    • 索引(动词):「索引一个文档」表示把一个文档存储到索引(名词)里,以 便它可以被检索或者查询。这很像 SQL 中的 INSERT 关键字,差别是,如果文档 已经存在,新的文档将覆盖旧的文档。

    (9)ES 中字符串类型有几个?区别是什么?

    有两个 keyword 和 Text,两个的区别主要分词的区别:

    • keyword 类型是不会分词的,直接根据字符串内容建立倒排索引,keyword 类 型的字段只能通过精确值搜索

    • Text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建 立倒排索引

    (10)ES 中 query 和 filter 的区别?

    • query:查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;

    • filter:查询操作仅判断是否满足查询条件,不会计算任何分值,也不会关心返 回的排序问题,同时,filter 查询的结果可以被缓存,提高性能。 

    (11)如何解决 ES 集群的脑裂问题

    所谓集群脑裂,是指 Elasticsearch 集群中的节点(比如共 20 个),其中的 10 个 选了一个 master,另外 10 个选了另一个 master 的情况。

    • 当集群中 master 候选节点数量不小于 3 个时(node.master: true),可以通过 设置最少投票通过数量(discovery.zen.minimum_master_nodes),设置超过所 有候选节点一半以上来解决脑裂问题,即设置为 (N/2)+1;

    • 当集群 master 候选节点 只有两个时,这种情况是不合理的,最好把另外一 个 node.master 改成 false。如果我们不改节点设置,还是套上面的(N/2)+1 公式, 此时 discovery.zen.minimum_master_nodes 应该设置为 2。这就出现一个问题, 两个 master 备选节点,只要有一个挂,就选不出 master 了

    (12)ES 索引数据多了怎么办,如何调优,部署?

    索引数据的规划,应在前期做好规划,正所谓“设计先行,编码在后”,这样才能有 效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户检索或者其他 业务受到影响。 如何调优,正如问题 1 所说,这里细化一下:

    • 动态索引层面 基于模板+时间+rollover api 滚动创建索引,举例:设计阶段定义:blog 索引的 模板格式为:blog_index_时间戳的形式,每天递增数据。 这样做的好处:不至于数据量激增导致单个索引数据量非常大,接近于上线 2 的 32 次幂-1,索引存储达到了 TB+甚至更大。 一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑+及早避免。

    • 存储层面 冷热数据分离存储,热数据(比如最近 3 天或者一周的数据),其余为冷数据。 对于冷数据不会再写入新数据,可以考虑定期 force_merge 加 shrink 压缩操作, 节省存储空间和检索效率。

    • 部署层面 一旦之前没有规划,这里就属于应急策略。 结合 ES 自身的支持动态扩展的特 点,动态新增机器的方式可以缓解集群压力,注意:如果之前主节点等规划合 理,不需要重启集群也能完成动态新增的。

    (13)详细描述一下 ES 搜索的过程?

    搜索拆解为“query then fetch” 两个阶段。

    • query 阶段的目的:定位到位置,但不取。 步骤拆解如下: –1)假设一个索引数据有 5 主+1 副本 共 10 分片,一次请求会命中(主或者 副本分片中)的一个。 –2)每个分片在本地进行查询,结果返回到本地有序的优先队列中。 –3)第 2)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。

    • fetch 阶段的目的:取数据。 路由节点获取所有文档,返回给客户端。

    (14)详细描述一下 ES 索引文档的过程?

    这里的索引文档应该理解为文档写入 ES,创建索引的过程。文档写入包含:单文档 写入和批量 bulk 写入,这里只解释一下:单文档写入流程。

    • 第一步:客户写集群某节点写入数据,发送请求。(如果没有指定路由/协调节 点,请求的节点扮演路由节点的角色。)

    • 第二步:节点 1 接受到请求后,使用文档_id 来确定文档属于分片 0。请求会被 转到另外的节点,假定节点 3。因此分片 0 的主分片分配到节点 3 上。

    • 第三步:节点 3 在主分片上执行写操作,如果成功,则将请求并行转发到节点 1 和节点 2 的副本分片上,等待结果返回。所有的副本分片都报告成功,节点 3 将向协调节点(节点 1)报告成功,节点 1 向请求客户端报告写入成功。 第二步中的文档获取分片的过程?

    • 借助路由算法获取,路由算法就是根据路由和文档 id 计算目标的分片 id 的过程。 • 。 

  • 相关阅读:
    不容易解的题10.10
    webAPI
    内存函数 memcpy 和 memmove 的讲解和模拟实现
    创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现
    复习这份阿里架构师的Java核心面试宝典,我四面腾讯拿下offer
    【Linux】进程概念
    怎样优雅地增删查改(五):按组织架构查询
    打破边界,边缘计算有何应用场景?
    最新AI创作系统ChatGPT网站源码Midjourney-AI绘画系统,Suno-v3-AI音乐生成大模型。
    TCP通信
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/127658665