面试题之ElasticSearch
- 1.es的基础知识
- 2. es的集群、节点、分片、副本分片的定义?
- 3. es为什么快?
- 4. 倒排索引的原理是什么?
- 5. es的segment是什么?
- 6. es的分段存储和分段索引的概念及区别?
- 7. 索引相关的问题?
- 8. es的编译器、分析器、过滤器是什么?
- 9. es的写入流程?
- 10. es的更新是怎么操作的?
- 11. es的删除是怎么操作的?
- 12. es是怎么实现搜索的?
- 13. es是怎么保证读写一致的?
- 14. es的分页方法有哪几种?
- 15. es的缓存的原理?缓存大小对使用有影响么?
- 16. es什么请求不能被缓存?
- 17. es优化查询的手段是什么?
- 18. es怎么批量导入数据?
- 19. es的文本相似度TF-IDF是什么?
- 20. 如何实现es的master选举的?
- 21. 如果多个节点都向其他节点发送我是主master的信息。那么其他节点是怎么确定一个节点是主master的?
- 22. es的api是什么?
- 23. elk你了解么?
- 24. 你公司es的集群是怎么配置的?
- 25. es的使用场景,为什么要选es作为搜索引擎?
- 26. es的聚合操作指的是什么?
- 27. es写入异常,或者写入缓慢怎么排查解决?
- 28. es 一共5m的存储空间,你存了4m,还想存3m,怎么存?
- 29.为了保证线上可用,导入的时候是怎么操作的?
重新自己整理过后的es相关面试题,这里包括八股文和之前面试遇到的问题,后续会持续更新~
1.es的基础知识
- es的类型定义和mysql的映射关系?
- es常用数据类型有哪些?
- es常用方法有哪些?
- es的分词有哪些?
es的类型定义和mysql的映射关系:
es | mysql |
---|---|
索引 Index | 数据库Database |
类型 Type | 表table |
文档document | 数据行row |
字段 Field | column |
es的常用数据类型:
- 字符串类型:包括text和keyword。text(不分词)类型用于全文搜索,而keyword(分词)类型适用于索引结构化内容,如ID、电子邮件地址、主机名、状态码、邮政编码或标签。
- 数值类型:包括整数、长整数、短整数、字节、双精度浮点数、单精度浮点数、半精度浮点数和缩放浮点数等。这些类型可用于存储不同范围的数值数据。
- 日期类型:date类型用于存储日期和时间。
- 布尔类型:boolean类型用于存储真或假值。
- 二进制类型:binary类型用于存储二进制数据。
- 范围类型:包括integer_range、float_range、long_range和double_range等,用于存储不同范围的数值数据。
- 数组类型:ES支持数组字段,可以存储多个值。
- 对象类型:单个JSON对象,用于存储复杂的数据结构。
- 嵌套类型:嵌套的JSON对象,用于处理具有复杂关系的JSON数据。
- Geo-point数据类型:geo_point类型用于存储地理坐标点,如经纬度。
- Geo-shape数据类型:geo_shape类型用于存储复杂的地理形状,如多边形。
- IP类型:ip类型用于存储IPv4和IPv6地址。
- Completion类型:completion类型用于自动完成查询。
es的常用方法:
- 索引创建:使用PUT或POST方法,向ES中添加或更新文档。
例如:PUT /index_name/_doc/doc_id {
"field": "value" }
- 索引获取:使用GET方法,获取指定索引的信息。
例如:GET /index_name
- 索引删除:使用DELETE方法,删除指定索引。
例如:DELETE /index_name
- 文档查询:使用GET方法,查询指定索引中的文档。
例如:GET /index_name/_search {
"query": {
"match": {
"field": "value" } } }
- 聚合查询:使用POST方法,对指定索引中的文档进行聚合分析。
例如:POST /index_name/_search {
"aggs":{
"group_by_field":{
"terms":{
"field":"field_name"}}}}
- 高亮显示:使用_highlight字段,在查询结果中高亮显示匹配的文本。
例如:GET /index_name/_search {
"highlight": {
"fields": {
"field_name":{
}}}}
- 排序查询:使用sort参数,对查询结果进行排序。
例如:GET /index_name/_search {
"sort": [ {
"field_name": {
"order": "asc" }}]}
- 分页查询:使用from和size参数,对查询结果进行分页。
例如:GET /index_name/_search {
"from": 0,"size":10,"query":{
"match":{
"field":"value"}}}
- 更新文档:使用POST或PATCH方法,更新指定索引中的文档。
例如:POST /index_name/_doc/doc_id/_update {
"doc":{
"field":"new_value"}}
- 删除文档:使用DELETE方法,删除指定索引中的文档。
例如:DELETE /index_name/_doc/doc_id
es的分词:
- Standard Analyzer:标准分词器,按词切分,小写处理,默认停用词默认是关闭的。
- Simple Analyzer:按照非字母切分,非字母都会被去除,即只处理字母,小写处理。
- Whitespace Analyzer:按照空格切分。
- Keyword Analyzer:不分词,直接将输入的文档当做一个词输出。
- Pattern Analyzer:通过在空格进行分词的情况下进行正则表达式进行分词,默认是\W+,非字符的符号进行分割;含停用词和小写处理。
- Language Analyzer:针对不同的语言选择分词,例如english语言分词,会去除词性,如running分词结果为run,- foxes分词结果为fox等;含有停用词处理。
- IK Analyzer:支持自定义词库,支持热更新分词词典。
- 问题1:有一个字段是”我爱中国“,我想查中国,能查出来么?
答:如果没有分词器,查不出来- 问题2:我有一个自定义的中文词库,能导入么?
答:可以,IK词库支持自定义词库。- 英文是默认空格分词的
2. es的集群、节点、分片、副本分片的定义?
集群有多个节点,一个节点正常来说部署一个分片(容灾考虑),当然也可以部署多个分片,每个分片都会有副本分片(当然也可以没有),每个分片是由多个分段组成。每个分片都只为一个索引服务,比如上边的分片12只为索引1服务。
集群:节点通过设置集群名称,在同一网络中发现具有相同集群名称的节点,组成集群。每个集群都有一个 cluster name 作为标识,默认的集群名称为 elasticsearch。如果在同一网络中只有一个节点,则这个节点成为一个单节点集群。
集群状态:
- Green:所有主分片和从分片都准备就绪(分配成功),即使有一台机器挂了(假设一台机器一个实例),数据都不会丢失,但会变成 Yellow 状态。
- Yellow:所有主分片准备就绪,但存在至少一个主分片(假设是 A)对应的从分片没有就绪,此时集群属于警告状态,意味着集群高可用和容灾能力下降,如果刚好 A 所在的机器挂了,而从分片还处于未就绪状态,那么 A 的数据就会丢失(查询结果不完整),此时集群进入 Red 状态。
- Red:至少有一个主分片没有就绪(直接原因是找不到对应的从分片成为新的主分片),此时查询的结果会出现数据丢失(不完整)。
节点:一个 ES 节点就是一个运行的 ES 实例,可以实现数据存储并且搜索的功能。每个节点都有一个唯一的名称作为身份标识,如果没有设置名称,默认使用 UUID 作为名称。最好给每个节点都定义上有意义的名称,在集群中区分出各个节点。
节点类型:
- master 节点: 集群中的一个节点会被选为 master 节点,它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群中删除节点。master 节点无需参与文档层面的变更和搜索,这意味着仅有一个 master 节点并不会因流量增长而成为瓶颈。任意一个节点都可以成为 master 节点。
- data 节点: 持有数据和倒排索引。默认情况下,每个节点都可以通过设定配置文件 elasticsearch.yml 中的 node.data 属性为 true (默认) 成为数据节点。如果需要一个专门的主节点 (一个节点既可以是 master 节点,同时也可以是 data 节点),应将其 node.data 属性设置为 false。
- client 节点: 如果将 node.master 属性和 node.data 属性都设置为 false,那么该节点就是一个客户端节点,扮演一个负载均衡的角色,将到来的请求路由到集群中的各个节点。
一个机器可以有多个实例,所以并不能说一台机器就是一个 node,大多数情况下每个 node 运行在一个独立的环境或虚拟机上。
分片(shard):分为主分片和副本分片
- 单个节点由于物理机硬件限制,存储的文档是有限的,如果一个索引包含海量文档,则不能在单个节点存储。ES 提供分片机制,同一个索引可以存储在不同分片(数据容器)中。
- 分片分为主分片 (primary shard) 以及从分片 (replica shard)。主分片会被尽可能平均地 (rebalance) 分配在不同的节点上(例如你有 2 个节点,4 个主分片(不考虑备份),那么每个节点会分到 2 个分片,后来你增加了 2 个节点,那么你这 4 个节点上都会有 1 个分片,这个过程叫 relocation,ES 感知后自动完成)。
- 从分片只是主分片的一个副本,它用于提供数据的冗余副本,从分片和主分片不会出现在同一个节点上(防止单点故障),默认情况下一个索引创建 5 个主分片,每个主分片会有一个从分片 (5 primary + 5 replica = 10 个分片)。如果你只有一个节点,那么 5 个 replica 都无法被分配 (unassigned),此时 cluster status 会变成 Yellow。
- 分片是独立的,对