Elasticsearch面试题总结
1、ElasticSearch是什么?
概念: Elasticsearch是由 java语言开发基于Lucene的一款开源的搜索、聚合分析和存储引擎。同时它也可以称作是一种非关系型文档数据库。
特点:
- 天生分布式、高性能、高可用、易扩展、易维护。
- 跨语言、跨平台:几乎支持所有的主流语言。
- 支持结构化、非结构化、地理位置搜索等
使用场景
- 海量数据的全文检索,搜索引擎、垂直搜索、站内搜索:
1.百度、知乎、微博、CSDN。
2.导航、外卖、团购等软件
3.以京东、淘宝为例的垂直搜索
4.B站、抖音、QQ音乐等软件
5.github - 数据分析和聚合查询
- 日志系统:ELK
2.Mapping是什么?
2.1 概念
ES中的mapping有点类似与RDB中“表结构”的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等。在Mapping里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一个字段可以有对个类型。分词器、评分等概念在后面的课程讲解。
2.2 ES数据类型
2.2.1.常见的数据类型
1.数据类型:long 、 integer、short、byte、double、float、half_float、scaled_float、unsigned_long
2.keywords:
- .keyword:适用于索引结构化的字段,可以用于过滤、排序、聚合。keyword类型的字段只能通过精确值(exact value)搜索到。ld应该用keyword。keyword字段通常用于排座,汇总和Term查询,例如term。
- constant keyword:始终包含相同值的关键字字段
- wildcard:可针对类似grep的通配符查询优化日志行和类似的关键字值
3.dates:包括date和date_nanos。
4.alias:为现有字段定义别名
5.text:当一个字段是要被全文搜索的,比如Email内容、产品描述,这些字段应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。(解释一下为啥不会为text创建正排索引:大量堆空间,尤其是在加载高基数text字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问题。这就是默认情况下禁用字段数据的原因)
2.2.2 结构化类型
1.geo-point:纬度/经度积分
2.geo-shape:用于多边形等复杂形状
3. point:笛寒尔坐标点
4.shape:笛卡尔任意几何图形
2.3 自动映射和手工映射
3.什么是全文检索
3.1 相关度
- 搜索:有明确 查找边界。
- 检索:讲究相关度,无明确的查询条件边界。
2.3 图解全文检索
用检索词小米NFC手机,被拆为小米、NFC和手机这三个词去整张表分词中取匹配,其中匹配了三个分词,如下图所示:
2.3.1 分词图解
在当前字段上,在你创建数据的时候,创建分词。
分词的创建过程可简单分为以下几个步骤:
1.切词
2.规范化
3.去重
4.字典序
其中,如图所示,一个切词就有一个term ,Postting List表示ES分词对应的物理表结构中的数据项。最后按照匹配度进行排名。
4.ES支持哪种类型查找?
4.2 按场景划分
4.2.1 Query String
4.2.2 全文检索
4.2.3 精准查询
4.3 按照数据类型划分
5. term、match、keyword有何区别,你还知道哪些检索类型
5.1、term和match
term:对于搜索词影响,不对源数据影响。
match:对搜索词影响,不对源数据影响。
5.2 term和keyword
term:检索类型
keyword:字段类型
6.什么是开发模式和生产模式
开发模式: 开发模式是默认配置(未配置集群发现设置),如果用户只是出于学习目的,而引导检查会把很多用户挡在门外,所以ES提供了一个设置项 discovery.type=single-node。此项配置为指定节点为单节点发现以绕过引导检查。
生产模式: 当用户修改了有关集群的相关配置会触发生产模式,在生产模式下,服务启动会触发ES的引导检查或者叫启动检查bootstrap checks)(或者叫启动检查),所谓引导检查就是在服务启动之前对一些重要的配置项进行检查,检查其配置值是否是合理的。引导检查包括对JVM大小、内存锁、虚拟内存、最大线程数、集群发现相关配置等相关的检查,如果某一项或者几项的配置不合理,ES会拒绝启动服务,并且在开发模式下的某些警告信息会升级成错误信息输出。引导检查十分严格,之所以宁可拒绝服务也要阻止用户启动服务是为了防止用户在对ES的基本使用不了解的前提下启动服务而导致的后期性能问题无法解决或者解决起来很麻烦。因为一旦服务以某种不合理的配置启动,时间久了之后可能会产生较大的性能问题,但此时集群已经变得难以维护,ES为了避免这种情况而做出了引导检查的设置。这种设定虽然增用户的使用门槛,但是避免了日后产生更大的问题
7.倒排索引的基本原理是什么?
7.1 概念
倒排索引:“关键词” =>“文档ID” ,即关键到文档id的映射。
7.2 倒排索引的基本数据结构
term dictionary表示词项,Posting List有序存放brand表中的主键id,term dictionary和Posting List的映射叫做倒排序索引。
8.为什么ES不像MySQL采用B+Tree的数据结构
8.1什么是索引
本质帮助快速检索
以数据结构为载体
以文件落地
8.2 数据库的组成
8.3 B-Trees的数据结构
8.4. B+Tree的数据结构
为什么B+Tree的每个节点只能存放16Kb的数据,而全文索引中的字段有些字段是text性能很有可能超过数据页的大小,如果出现一个超大的数据存储该字段,那么可能要用多个节点存储该字段,那个节点数会出现指数级的增长,导致数的深度特别的深,所以InnoDB不支持全文索引。
8.5 总结
1.索引往往字段很长,如果使用B+Trees,树的深度很深,IO很可怕。
2.性能无法保证并且索引失效。
3.精准度差,并且无法和其他属性产生相关性。
结束语
本篇到此结束了后面还会有相关的高级知识。