面试题之ElasticSearch

重新自己整理过后的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。
  • 分片是独立的,对于一个 Search Request 的行为,每个分片都会执行这个 Request。每个分片都是一个 Lucene Index,所以一个分片只能存放 Integer.MAX_VALUE - 128 = 2,147,483,519 个 docs。

副本分片(replica):是分片的一份或多份拷贝,就是副本分片;

replica 的作用主要包括:

  • 容灾:primary 分片丢失,replica 分片就会被顶上去成为新的主分片,同时根据这个新的主分片创建新的 replica,集群数据安然无恙;
  • 提高查询性能:replica 和 primary 分片的数据是相同的,所以对于一个 query 既可以查主分片也可以查从分片,在合适的范围内多个 replica 性能会更优(但要考虑资源占用也会提升 [cpu/disk/heap]),另外 Index Request 只能发生在主分片上,replica 不能执行 Index Request。

注意:对于一个索引,除非重建索引否则不能调整主分片的数目 (number_of_shards),但可以随时调整 replica 的数目 (number_of_replicas)。

3. es为什么快?

  • 分布式架构:Elasticsearch采用分布式架构,可以横向扩展到数百台服务器,处理大规模数据集。它通过将数据分片到不同的节点上,提高了并行处理能力和数据分布的均匀性,从而提高了查询性能。
  • 近实时搜索:Elasticsearch提供了近实时搜索功能,能够在数秒内完成数据的索引和查询。这得益于其高效的索引和查询机制,以及数据复制和分片的策略。
  • 倒排索引:Elasticsearch使用倒排索引技术,将文本数据分词后保存为倒排索引,使得能够快速查找包含特定词项的文档。这种数据结构大大提高了搜索效率。
  • 高效的数据存储和检索:Elasticsearch使用Lucene作为其存储和检索引擎,通过优化存储和检索过程,提高了数据访问速度。它还支持对数据的压缩存储,进一步减少了磁盘空间的使用和提高了IO效率。
  • 分段和合并策略:Elasticsearch采用分段和合并策略来优化磁盘空间使用和提高查询性能。它将索引分为多个段,当需要检索时,可以并行地对这些段进行操作,从而提高检索速度。它还定期合并这些段以释放磁盘空间,并在必要时对索引进行优化以提高性能。
  • 请求路由:Elasticsearch通过请求路由机制将查询请求分发到适当的节点上,从而避免了不必要的网络传输和节点间通信。这有助于提高查询性能和系统的可用性。
  • 缓存机制:Elasticsearch使用缓存机制来提高查询性能。它缓存常用的查询结果和数据片段,以便能够快速返回响应结果。这减少了重复的计算和磁盘IO操作,提高了查询效率。
  • 优秀的硬件支持:Elasticsearch对硬件配置有较高的要求,尤其是磁盘I/O性能和内存容量。使用高性能的硬件配置可以进一步提高Elasticsearch的性能表现。

4. 倒排索引的原理是什么?

倒排索引是一种以词为基础的数据结构,用于将词与包含该词的文档建立映射关系。它的原理是将文档集合中的每个文档进行分词,将每个词与包含该词的文档建立映射关系。具体来说,倒排索引表中的每一项都包括一个属性值(即词)和具有该属性值的各记录的地址(即包含该词的文档列表)。查询时,可以通过倒排索引快速找到包含某个词的文档,从而提高检索效率。倒排索引一般表示为一个关键词和它的频度、位置等信息,好比一本书的目录、标签一般,读者可以根据目录直接找到相关的页面,不必再从书的第一页到最后一页,一页一页的查找。

5. es的segment是什么?

在Elasticsearch中,Segment是数据存储和检索的基本单位。多个段组成分片,当数据被索引时,它们被分配到不同的Segment中。每个Segment在磁盘上都是一个独立的文件,并且包含了一部分索引的数据。

Segment的主要作用是提高搜索和索引的效率。在执行搜索操作时,Elasticsearch会并行搜索多个Segment,然后将结果合并返回给用户。这种并行搜索的方式能够大大加速搜索过程。而在进行索引操作时,Elasticsearch会根据需要将文档写入到相应的Segment中。这种分段的方式,可以有效地降低内存占用和磁盘的使用,提高索引的效率。

当新的数据被索引时,它们首先被写入到一个新的Segment中。随着时间的推移,旧的Segment可能会被标记为不再使用,并被删除。这个过程是由Elasticsearch自动管理的,用户不需要手动干预。

总之,Segment是Elasticsearch中用于存储和检索数据的基本单位,它通过并行搜索和分段存储的方式来提高搜索和索引的效率。

6. es的分段存储和分段索引的概念及区别?

分段存储

  • 数据被分成了多个段(segments),每个段都是一个独立的索引文档集合。这种分段存储的方式可以更高效地分配内存和存储空间,因为不同的索引可以使用不同的段来存储数据。
  • 当有新的数据需要创建索引时,由于段的不变性,所以选择新建一个段来存储新增的数据。这种增量创建的方式可以提高性能,避免了对已有数据的全量复制。
  • 在更新数据时,结合新增和删除操作。先在.del 文件中记录旧数据,再在新段中添加一条更新后的数据。这样可以提高性能,因为数据操作是在内存中完成的,减少了磁盘I/O操作。
  • Elasticsearch的底层使用Lucene,而Lucene使用基于倒排索引和分段(segment)存储的方式完成数据索引。索引文件被拆分为多个子文件,每个子文件就叫做段。每个段本身都是一个倒排索引,并且段具有不变性,一旦索引的数据被写入硬盘,就不可再修改。这种分段存储模式使它在读写时几乎完全避免了锁的出现,大大提升了读写性能。
  • 段被写入到磁盘后会生成一个提交点,提交点是一个用来记录所有提交后段信息的文件。一个段一旦拥有了提交点,就说明这个段只有读的权限,失去了写的权限。相反,当段在内存中时,就只有写的权限,而不具备读数据的权限,意味着不能被检索。

分段索引

  • 在Elasticsearch中,分段索引(Segment)是倒排索引的一部分,它是Elasticsearch中最小的存储单元。每个分段都包含了特定范围内的文档数据以及相应的倒排索引信息。分段的存在使得Elasticsearch能够在数据更新、删除、搜索等操作时进行并发处理,从而提高搜索的效率,降低IO的开销,并且还能支持实时搜索等功能。

  • 在底层,Elasticsearch将索引文件拆分为多个子文件,每个子文件就是一个段。每个段本身都是一个倒排索引,并且段具有不变性,一旦索引的数据被写入硬盘,就不可再修改。这种分段存储模式使它在读写时几乎完全避免了锁的出现,大大提升了读写性能。

  • 当文档被索引时,Elasticsearch会自动根据一定的条件触发分段的创建。当索引的文档数量达到一定的阈值时,会触发新的分段的创建。除了自动触发,也可以手动触发分段的创建。通过API可以指定创建新的分段,这在某些情况下是非常有用的,比如在数据导入完成后手动进行一次分段的优化等。

简述概念及区别,可以总的来说,虽然两者都涉及到数据切分,但是

  • 分段索引是倒排索引的一部分,是Elasticsearch中最小的存储单元,包含了特定范围内的文档数据以及相应的倒排索引信息,主要关注于倒排索引的组成和存储,用于提高搜索效率、降低IO开销和实现实时搜索的一种机制;
  • 分段存储则是将索引数据分成多个独立的段,每个段包含一个索引的文档集合,更关注于整个索引数据的切分和存储方式,这样可以更高效地分配内存和存储空间。

7. 索引相关的问题?

  • 什么是索引?
  • 索引优化?
  • 索引数据多了,如何调优,部署?
  • 索引失效的原因?

索引
Elasticsearch(ES)中的索引是一个逻辑存储空间,用于存储、搜索、分析和查询数据。它类似于关系型数据库中的数据库,可以将数据存放在一台服务器上,也可以分片后存放到多台服务器上。每个索引由一个或多个分片组成,每个分片可以有多个副本。

每个索引包含一个或多个文档,每个文档包含一个或多个字段。这些字段可以是结构化的,也可以是非结构化的。索引的映射定义了文档的结构和字段类型,包括字段名、字段类型、分析器等。

此外,索引还可以进行各种查询和过滤操作,如全文搜索、词条搜索、范围搜索和正则表达式搜索等。通过聚合,可以对文档进行分组和汇总,计算统计信息和计算指标。

索引优化

  • 调整索引设置:根据实际需求和数据量大小,合理设置索引的shard 数量、副本数等参数,以提高索引的读写性能和容错能力。
  • 优化映射:定义合适的字段类型和映射关系,避免过度映射或缺失映射,可以提高索引的准确性和查询效率。
  • 定期清理和维护:定期清理过期的数据和日志文件,释放存储空间,同时保持索引的最新状态,可以避免不必要的磁盘空间浪费和性能下降。
  • 使用合适的分词器和分析器:根据数据的特点和查询需求,选择合适的分词器和分析器,可以提高索引的准确性和查询性能。
  • 避免过度索引:避免创建过多的索引和不必要的字段,可以减少磁盘使用空间和提高查询效率。
  • 合理使用聚合查询:聚合查询可以提高数据的分析能力和查询效率,但过多的聚合操作会增加索引的负担和查询时间。因此,需要合理使用聚合查询。
  • 优化数据写入:控制数据写入的速率和批量操作的大小,可以减少磁盘I/O负载和提高写入效率。
  • 使用缓存:合理利用Elasticsearch内置的缓存机制,可以提高查询速度和减轻索引的负担。
  • 监控和调优:定期监控索引的性能指标和资源使用情况,根据实际情况进行调优和优化,可以保持索引的高效运行状态。

索引数据多了,如何调优,部署

面试官是想考察大数据量的运维能力

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

  • 动态索引层面:
    基于模板+时间+rollover api 滚动创建索引,举例:设计阶段定义:blog 索引的模板格式为: blog_index_时间戳的形式,每天递增数据。这样做的好处:不至于数据量激增导致单个索引数据量非常大,接近于上线 2 的32 次幂-1,索引存储达到了 TB+甚至更大。
    一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑+及早避免。
  • 存储层面
    冷热数据分离存储,热数据(比如最近 3 天或者一周的数据),其余为冷数据。
    对于冷数据不会再写入新数据,可以考虑定期 force_merge 加 shrink 压缩操作,节省存储空间和检索效率。
  • 部署层面
    一旦之前没有规划,这里就属于应急策略。
    结合 ES 自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意:如果之前主节点等规划合理,不需要重启集群也能完成动态新增的。

es索引失效的原因?

  • 索引被删除或不存在:当索引被删除或不存在时,相关的查询请求将无法找到匹配的索引,导致查询失败或返回空结果。
  • 数据类型不匹配:在查询时,如果请求中的数据类型与索引中的数据类型不匹配,可能会导致索引失效。例如,使用了错误的日期格式或数字范围。
  • 字段不存在:如果查询中引用了不存在的字段,或者字段名称拼写错误,将无法找到匹配的字段,导致索引失效。
  • 查询语法错误:查询语句中存在语法错误,例如使用了错误的查询操作符或错误的查询语法结构。
  • 过滤器或聚合函数错误:在使用过滤器或聚合函数时,如果函数参数错误或参数类型不匹配,会导致索引失效。
  • 映射类型不匹配:在创建索引时,如果没有正确配置映射类型,或者映射类型与数据不匹配,会导致索引失效。
  • 版本冲突:在更新文档时,如果新版本与旧版本冲突,可能会导致索引更新失败。
  • 权限问题:如果Elasticsearch集群的安全设置限制了对特定索引的访问,或者用户没有足够的权限访问索引,会导致索引失效。
  • 资源限制:如果Elasticsearch集群的资源使用达到上限,例如内存、CPU或磁盘空间不足,可能会导致索引写入或查询失败。
  • 网络问题:网络延迟、丢包或网络不稳定可能导致请求无法正确到达Elasticsearch节点,导致索引失效。

8. es的索引写入和文档写入定义及区别?

索引写入

  • 当有新的数据需要写入索引时,数据首先会被写入到内存中的缓冲区。
  • 每隔1秒,内存中的缓冲区数据会被刷新(flush)到操作系统的缓存中,并生成一个segment文件。
  • 在这个过程中,Elasticsearch会进行refresh操作,将内存中的数据写入到硬盘上。
  • 由于硬盘上的日志文件会不断增大,因此每隔30分钟,Elasticsearch会强制将translog日志文件中的数据刷到磁盘的segment文件中,并清空日志文件。这个过程叫做flush。
  • 由于磁盘中的日志文件是每隔5秒钟就写入一次的,那么肯定会越来越大,所以每隔30分钟会强行将translog日志文件中的数据刷到磁盘segment file中,然后清空日志文件。这个过程叫做flush。
  • 在flush的过程中,会进行segment merge操作,将相似的多个文件合并为一个文件。同时,还会写一个commit point,标识所有新的segment file文件,并打开文件供搜索操作。同时删除旧的segment file文件。
  • 在整个写入过程中,Elasticsearch会使用多线程或多进程来并行处理数据写入操作,以提高写入效率

文档写入

  • 客户端选择一个节点作为协调节点,该节点负责路由和分片的管理。协调节点首先会根据文档的ID进行哈希计算,确定应该将文档写入哪个分片。
  • 协调节点将请求发送到对应的主分片所在的节点上。如果当前节点不是主分片所在节点,则请求将被转发到主分片所在的节点上。
  • 主分片节点接收到写入请求后,会将文档写入到内存中的缓冲区,并同步到副本分片上。数据写入完成后,向协调节点发送写入成功的响应。
  • 协调节点收到写入成功的响应后,返回结果给客户端,完成写入操作。

在写入文档的过程中,Elasticsearch会使用多个线程或进程来并行处理数据写入操作,以提高写入效率。同时,为了防止数据丢失,Elasticsearch会将每次写入的数据同时写入到translog日志中,并提供实时的CRUD操作。此外,为了提高查询性能和容错能力,Elasticsearch会将数据分成多个分片和副本,并使用倒排索引进行索引和搜索操作。

区别

  • 索引写入主要涉及到索引的创建、更新和删除操作。当需要创建一个新的索引或者对已有的索引进行更新时,会涉及到索引写入的逻辑。索引写入会更新Elasticsearch中的元数据信息,并可能会涉及到分片和副本的分配、映射类型的更新等操作。索引写入是一个比较重量级的操作,通常会在索引结构发生较大变化时进行。
  • 文档写入则是针对具体的文档进行写入操作,包括文档的创建、更新和删除。文档写入是一个相对轻量级的操作,可以在不影响索引结构的情况下对单个文档进行写入。

9. es的编译器、分析器、过滤器是什么?

编译器:编译器用于将字符串分解为术语或标记流。一个简单的编译器可能会将字符串拆分为任何遇到空格或标点的地方。Elasticsearch有许多内置标记器,可用于构建自定义分析器。
分析器:在ElasticSearch中索引数据时,数据由为索引定义的Analyzer在内部进行转换。 分析器由一个 Tokenizer和零个或多个TokenFilter组成。编译器可以在一个或多个CharFilter之前。分析模块允许 您在逻辑名称下注册分析器,然后可以在映射定义或某些API中引用它们。
Elasticsearch附带了许多可以随时使用的预建分析器。或者,您可以组合内置的字符过滤器,编译 器和过滤器器来创建自定义分析器
过滤器:过滤器(Filters)是一种用于在查询中筛选文档的强大工具。过滤器可以根据特定条件来评估文档是否符合搜索查询。这些条件通常应用于字段数据,并根据匹配结果返回符合条件的文档。

在Elasticsearch中,有多种类型的过滤器可供使用,包括:

类型过滤器(Type Filter):根据文档的类型进行过滤,仅返回符合特定类型的文档。
范围过滤器(Range Filter):根据特定范围的字段值进行过滤。
关键字过滤器(Keyword Filter):用于匹配特定文本的过滤器。
布尔过滤器(Boolean Filter):允许根据布尔表达式组合多个过滤条件。
复合过滤器(Composite Filter):将多个过滤条件组合在一起,以实现更复杂的筛选逻辑。

10. es的更新是怎么操作的?

在Elasticsearch中,更新操作可以分为两种情况:更新和替换。

  • 更新(Update):更新操作是对文档的字段进行修改,而不是替换整个文档。当更新一个文档时,Elasticsearch会加载原始文档的源数据,并根据更新请求对字段进行修改。修改后的文档会被保存到倒排索引中,并生成一个新的版本号。

  • 替换(Replace):替换操作是用新的文档替换原始的文档。当替换一个文档时,Elasticsearch会直接将新文档保存到倒排索引中,并生成一个新的版本号。这种操作会比更新操作更加耗时,因为需要将整个文档写入磁盘。

Elasticsearch的更新机制包括以下步骤:

  • 检查文档的版本号:在更新过程中,Elasticsearch会检查文档的版本号。每个文档都有一个唯一的版本号,用于标识文档的修改历史。当一个更新请求到达Elasticsearch时,它将文档的版本号与请求中携带的版本号进行比较,如果不一致则返回一个版本冲突的错误。如果版本号一致,则Elasticsearch会进行更新操作。
  • 加载源数据:在更新过程中,Elasticsearch会将文档的源数据加载到内存中,并进行字段的修改。
  • 生成新的版本号:Elasticsearch会为修改后的文档生成一个新的版本号,并将其保存到倒排索引中。
  • 乐观并发控制:Elasticsearch采用乐观并发控制机制,可以在并发更新的情况下保证操作的一致性和可靠性。同时,由于不需要加锁等额外开销,这种机制也能够提高系统的性能和吞吐量。
  • 处理并发更新冲突:当多个并发更新操作到达Elasticsearch时,它们会依次执行,并依次检查版本号。如果版本号一致,则允许更新操作执行;如果版本号不一致,则会返回一个版本冲突的错误。在出现版本冲突的情况下,一般有两种处理方式:重试(Retry)和替换(Replace)。重试操作可以等待一段时间再重新发送更新请求,或者通过修改更新请求中的版本号来避免冲突。

并发更新的冲突处理

  • 在高并发的场景下,可能会出现多个并发更新操作冲突的情况。Elasticsearch会通过版本号来解决这个问题。
  • 当多个并发更新操作到达Elasticsearch时,它们会依次执行,并依次检査版本号。如果版本号一致,则允许更新操作执行;如果版本号不一致,则会返回一个版本冲突的错误。

在出现版本冲突的情况下,一般有两种处理方式:

  • 重试(Rctry):可以在发生版本冲突后进行重试操作。重试操作可以等待一段时间再重新发送更新请求,或者通过修改更新请求中的版本号来避免冲突。通过重试可以解决版本冲突,但可能会造成额外的延迟和资源消耗。
  • 使用乐观并发控制机制(Optimistic Concurrency Control):在更新操作中采用乐观并发控制机制,可以避免版本冲突并提高系统的性能和吞吐量。乐观并发控制机制通过比较版本号来确定是否允许更新操作,并采用更新操作的方式将文档保存到倒排索引中。

11. es的删除是怎么操作的?

删除操作的执行流程:

  • 客户端向Elasticsearch发送一个删除请求,包含要删除的文档的D。
  • Elasticsearch接收到删除请求后,会首先检查要删除的文档是否存在。如果文档不存在,则返回一个错误响应。
  • 如果文档存在,Elasticsearch会将要删除的文档的标识信息添加到删除列表中。
  • 当删除列表中的标识信息达到一定数量或者删除列表的大小达到一定阈值时,Elasticsearch会触发一个合并操作。
  • 在合并操作中,Elasticsearch会将删除列表中的标识信息应用到倒排索引中,将对应的文档标记为已删除状态。
  • 合并操作完成后,Elasticsearch会返回一个成功响应给客户端。

合并操作的原理:合并操作是将删除列表中的标识信息应用到倒排索引中的过程。下面是合并操作的原理:

  • Elasticsearch会将倒排索引分成多个段(segment),每个段包含一部分文档的索引信息。
  • 当删除列表的大小达到一定阈值或者删除列表中的标识信息达到一定数量时,Elasticsearch会触发一个合并操作。
  • 在合并操作中,Elasticsearch会选择一些段进行合并。合并的目的是将多个段合并成一个较大的段,从而提高搜索性能。
  • 在合并的过程中,Elasticsearch会将删除列表中的标识信息应用到倒排索引中,将对应的文档标记为已删除状态。
  • 合并操作完成后,Elasticsearch会生成一个新的段,包含合并后的索引信息,并将该段添加到倒排索引中。
  • 合并操作完成后,删除列表会被清空,以便下一次的删除操作。

在使用Elasticsearch进行删除操作时,有一些注意事项需要考虑:

  • 删除操作并不是直接从磁盘上删除文档,不立即生效,而是将文档标记为已删除状态,所以在搜索时,已删除的文档仍然可以被返回。这是因为Elasticsearch采用了一种称为倒排索引的数据结构来存储文档。倒排索引是一种将文档中的每个词映射到包含该词的文档的数据结构。
  • 物理删除:如果需要完全从磁盘上删除文档,可以使用Elasticsearch的物理删除API。物理删除操作会从磁盘上删除文档的索引信息,但需要注意的是,该操作会导致索引变得不可用,需要重新构建索引。
  • 自动合并:当执行删除操作时,Elasticsearch会将要删除的文档的标识信息(比如文档的I)添加到一个被称为删除列表(deletelist)的数据结构中,Elasticsearch会自动触发合并操作,将删除列表中的标识信息应用到倒排索引中。但是,如果删除列表的大小较小或者删除操作较少,合并操作可能会较少触发,从而导致已删除的文档占用较多的磁盘空间。可以通过调整合并策略和手动触发合并操作来解决这个问题。

12. es是怎么实现搜索的?

  • 连接到集群:首先,客户端需要连接到Elasticsearch集群。这通常可以通过配置代理服务器或直接连接Elasticsearch实例来完成。
  • 执行查询:一旦连接到集群,客户端可以使用适当的查询语言(如Elasticsearch查询语言或REST API)来发送搜索请求。查询可以根据需求进行定制,例如使用过滤器、聚合、排序等。
  • 路由与寻址:一旦接收到搜索请求,集群中的节点会根据请求中的查询条件和索引信息确定需要搜索的索引和分片。这个过程涉及到路由和寻址,以确保请求被发送到正确的节点上。
  • 分片选择和请求转发:在确定了要搜索的分片后,协调节点会根据分片副本选择一个主分片或一个副本分片来执行搜索操作。协调节点会将搜索请求转发给选定的分片。
  • 执行搜索计划:在分片上,搜索计划被执行。这个阶段包括对文档进行过滤、排序、聚合等操作,以生成匹配的文档列表。
  • 获取结果:在执行搜索计划后,获取阶段开始。在获取阶段中,从匹配的文档中提取相关的信息,例如文档ID和相关统计信息,并将这些信息返回给协调节点。
  • 返回结果:协调节点将接收到的结果返回给客户端。客户端可以获取和处理这些结果,以展示最终的搜索结果。
  • 结束处理:在完成一次搜索请求后,关闭与集群的连接,结束整个搜索过程。

13. es是怎么保证读写一致的?

  • Elasticsearch 提供了乐观并发控制机制来保证读写一致性。具体来说,当文档被更新时,它会检查文档的版本号是否与请求中提供的版本号一致。如果版本号一致,则更新操作成功;否则,更新操作失败,返回文档的当前版本号。这种机制可以防止多个并发操作对同一文档进行修改,从而保证读写一致性。

  • Elasticsearch 还提供了写一致性级别,包括 quorum、one 和 all。默认情况下,写操作需要在大多数分片可用时才允许执行。这意味着如果大多数分片可用,则更新操作可以成功执行;否则,更新操作将失败。这种机制可以确保在分布式环境下,数据的一致性得到维护。

  • 在读操作方面,Elasticsearch 支持同步和异步读取。默认情况下,读取操作会在主分片和副本分片都完成后才会返回结果。这可以确保读取的数据是最新的。此外,可以通过设置搜索请求参数 _preference 为 primary 来查询主分片,以确保文档是最新版本。

14. es的分页方法有哪几种?

from-size分页:它通过指定起始位置(from)和查询结果数量(size)来获取数据。

  • 在from-size分页中,from参数指定了返回结果集的起始位置,而size参数指定了返回结果集的长度。默认情况下,Elasticsearch中的from-size分页起始位置(from)为0,查询结果数量(size)默认为10。

  • 当需要查询第n页数据时,可以通过计算偏移量来指定起始位置。假设每页显示10条数据,那么第n页的起始位置可以通过(n-1)*10来计算。例如,要查询第2页的数据,可以将from设置为10,size设置为10。

需要注意的是:

  • 当查询大量数据时,使用from-size分页可能会对性能产生影响。因为Elasticsearch需要对整个结果集进行排序和过滤,然后再返回指定位置的数据。为了避免性能问题,可以考虑使用search_after分页方式,它基于上一页的最后一条数据来确定下一页的位置,避免了深度分页带来的性能问题。
  • 当使用from-size分页时,需要注意返回的数据量不能超过Elasticsearch的限制。默认情况下,Elasticsearch中的最大查询结果数量为10,000条。如果需要查询的数据量超过了这个限制,可以考虑使用scroll API进行滚动查询

search_after分页:search_after分页方式是一种基于上一页的最后一条数据来确定下一页的位置的分页方式。

  • 在search_after分页中,需要设置from参数为0,并使用上一页返回的最后一条数据的sort属性值作为参数传入到search_after中。这样可以确保下一页的数据从上一页的最后一条数据之后开始查询。

  • 需要注意的是,为了使用search_after分页方式,每个文档必须有一个全局唯一值,官方推荐使用_uid作为全局唯一值。另外,在查询时需要根据排序条件设置sort参数,以便正确地找到上一页的最后一条数据。

scroll 深翻页:scroll API使用一个全局深度翻页的操作,首次请求会返回一个scroll_id,使用该scroll_id可以顺序获取下一批次的数据。

scroll API的具体使用步骤如下:

  • 发送一个搜索请求,并在请求中指定scroll参数,该参数指定了滚动搜索的时间(默认为1分钟)。
  • 返回的结果中,除了正常的搜索结果外,还会返回一个scroll_id。这个scroll_id可以用于在后续的请求中继续搜索。
  • 当需要获取下一批次的搜索结果时,发送一个新的搜索请求,并使用上一次返回的scroll_id作为参数。
  • 重复步骤3,直到没有更多的结果可以返回。

需要注意的是,scroll API只能用于处理大量数据的翻页查询,它可以提高查询性能并避免深度分页带来的性能问题,不能用于实时查询。另外,由于滚动搜索会一直保持一个开启的连接,因此需要确保在使用滚动搜索时不要忘记关闭连接,否则可能会导致资源泄漏。

15. es的缓存的原理?缓存大小对使用有影响么?

文件系统缓存(页缓存):当Elasticsearch需要读取某个文档时,它首先会尝试从页缓存中获取该文档的数据块。如果页缓存中不存在该数据块,则会从硬盘中读取该数据块并缓存在页缓存中。这样,在下次需要读取该文档时,可以直接从缓存中获取,避免了磁盘IO操作,提高了查询效率。

需要注意的是,页缓存是操作系统级别的缓存,而不是Elasticsearch自身的缓存机制。因此,页缓存的大小和配置取决于操作系统的设置和硬件资源

分片缓存(Shard request cache)

  • ES会将数据分散到多个分片中,并在查询时指定分片和副本。当查询一个分片时,ES会将该分片的数据缓存在内存中,并在后续的查询中直接从缓存中读取数据,避免了重复的磁盘IO操作。
  • 分片级别的缓存并不会将整个索引的结果都缓存起来,而是根据数据的访问频率和数据量大小等因素来动态调整缓存的大小和过期时间等参数。同时,为了保持数据的一致性和避免脏读等问题,Elasticsearch也会对缓存进行同步更新和清理操作。
  • 默认情况下,Shard Request Cache只会缓存查询中参数size=0的搜索请求的结果,因此不会缓存hits,但会缓存hits.total、aggregations(聚合)和suggestions。因此,Shard Request Cache非常适合日志用例场景,在这种情况下,数据不会在旧索引上更新,并且可以将常规聚合保留在高速缓存中以供重用。
  • 这种缓存机制可以有效地提高查询效率,特别是对于频繁访问的搜索请求。然而,当索引数据发生变化时,缓存会失效。因此,在使用Shard Request Cache时,需要考虑数据更新的频率和查询负载等因素,合理配置缓存大小和缓存策略。

查询缓存(Filter Cache/Query Cache):用于对一个查询中包含的过滤器执行结果进行缓存。当查询结果被缓存后,后续的相同查询可以直接从缓存中获取结果,无需重新计算。Query Cache对满足某些条件的查询结果进行缓存,例如Term、Range过滤器和特定的聚合结果。Query Cache的主要作用是减少对索引的搜索成本,提高查询效率。

需要注意的是,ES的缓存机制是自动的,不需要用户手动配置。ES会自动根据数据的访问频率和数据量大小等因素来调整缓存的大小和过期时间等参数。同时,为了保持数据的一致性和避免脏读等问题,ES也会对缓存进行同步更新和清理操作。

缓存大小对使用有影响:

  • 缓存大小对Elasticsearch的使用有一定影响。缓存是用于存储经常访问的数据,以便快速响应查询请求,提高查询效率。因此,缓存大小的设置应该根据实际应用的需求和硬件资源进行合理配置。

  • 如果缓存设置得太小,无法容纳足够的数据量,会导致缓存命中率较低,需要频繁地访问磁盘IO,从而影响查询性能。而如果缓存设置得太大,会占用更多的内存资源,可能会导致其他应用或系统资源受到限制。

  • 因此,需要根据实际应用的特点和数据量大小,合理设置缓存大小。可以通过监控Elasticsearch的性能指标,如查询响应时间、缓存命中率等,来调整缓存大小,以达到最佳的性能表现。同时,也需要考虑硬件资源的限制,如可用内存的大小,以确保系统的稳定性和性能。

16. es什么请求不能被缓存?

  • 当segment的文档数量小于10000或者小于总index数量的3%时,查询是不会缓存的。
  • 使用了scroll滚动查询。
  • 查询类型不是QUERY_THEN_FETCH。
  • 带有分析的查询,设置了profile属性。
  • 不需要缓存的情况。
  • 范围查询中带有now的。
  • TermQuery:这种查询用于查找文档中包含特定词项的字段。
  • MatchAllDocsQuery:这种查询用于匹配索引中的所有文档。
  • MatchNoDocsQuery:这种查询用于在没有任何文档满足给定条件的情况下使用。
  • BooleanQuery:这种查询用于组合多个查询条件,通过逻辑运算符(如AND、OR、NOT)来组合多个查询条件。
  • DisjunctionMaxQuery:这种查询用于在多个字段上执行相同的查询,并返回匹配任意字段的文档。
  • 当BooleanQuery的字节点为空时不会被缓存,当DisMaxQuery的Disjuncts为空时不会被缓存。
  • 对于历史查询次数有要求,对于消耗高昂的Query只需要2次就加入缓存,其他的默认是5次,对于BooleanQuery和DisjunctionMaxQuery次数为4次。

TermQuery、MatchAllDocsQuery、MatchNoDocsQuery、BooleanQuery、DisjunctionMaxQuery这些查询类型在Elasticsearch中被标记为"not cacheable",意味着它们的查询结果不会被缓存,每次查询都需要重新计算和获取数据。这主要是因为这些查询通常涉及到特定的条件或逻辑,不适合直接从缓存中获取结果。

17. es优化查询的手段是什么?

  • 索引优化:在查询频繁的字段上建立索引,并使用合适的索引类型(如text、keyword等)和设置(如分析器、字段大小等),以减少索引的体积和加快查询速度。此外,还可以通过合并索引段、优化刷新和合并操作等来提高索引性能。
  • 分区和分片:将数据分散到多个分片中,并在查询时指定分片和副本。合理配置分片和副本的数量,可以平衡数据分布和查询负载,提高查询效率。
  • 缓存:利用ES的查询缓存功能,将经常查询的结果缓存起来,避免重复计算和减少IO操作。合理配置缓存的大小和过期时间,可以提高缓存命中率并加快查询速度。
  • 使用合适的查询语句:避免使用过于复杂的查询语句,如没有明确限制条件的范围查询或嵌套查询等。尽量使用简单、明确的查询语句,并利用ES的聚合和过滤功能来减少数据量。
  • 硬件和性能优化:使用高性能的硬件资源,如多核CPU、大容量内存和高速磁盘等。同时,对ES进行性能调优,如调整JVM内存大小、优化GC算法等。
  • 数据预热:在查询之前,通过预加载或预热数据的方式,将常用的数据提前加载到缓存中,提高缓存命中率并加快查询速度。
  • 使用ES集群:通过将数据分散到多个ES节点上,可以提高系统的可扩展性和容错性。合理配置节点数量、分片和副本数量,可以平衡数据分布和查询负载,提高查询效率。

18. es怎么批量导入数据?

批量操作是通过_bulk API实现的,它允许你一次性执行多个索引、删除、更新或创建操作。_bulk API的请求体使用JSON格式,其中包含多个操作。每个操作都由一个操作类型和一个请求体组成。

以下是一个_bulk请求的示例语法:

POST /_bulk  
{
     
  "operations" : [  
    {
    "index" : {
    "_index" : "test", "_id" : "1" } }  
    {
    "field1" : "value1" }  
    ,  
    {
    "delete" : {
    "_index" : "test", "_id" : "2" } }  
  ]  
}

在上面的示例中,operations数组包含了多个操作。第一个操作是一个index操作,用于将一个文档插入到名为"test"的索引中,文档的ID为"1",字段field1的值为"value1"。第二个操作是一个delete操作,用于删除索引"test"中ID为"2"的文档。

请注意,每个操作都需要单独定义,并在每个操作之间添加一个逗号和一个换行符。此外,还可以定义其他操作,如update和create等;

在Java中使用Elasticsearch Java REST Client进行批量操作的示例代码如下:

import org.elasticsearch.action.bulk.BulkRequest;  
import org.elasticsearch.action.bulk.BulkResponse;  
import org.elasticsearch.action.index.IndexRequest;  
import org.elasticsearch.client.RequestOptions;  
import org.elasticsearch.client.RestHighLevelClient;  
import org.elasticsearch.common.xcontent.XContentType;  
  
import java.io.IOException;  
import java.util.List;  
  
public class BulkImportDemo {
     
    public static void main(String[] args) throws IOException {
     
        try (RestHighLevelClient client = new RestHighLevelClient(  
                RestClient.builder(new HttpHost("localhost", 9200, "http")))) {
     
            // 创建bulk请求  
            BulkRequest bulkRequest = new BulkRequest();  
            // 添加index操作  
            IndexRequest indexRequest = new IndexRequest("test");  
            indexRequest.id("1");  
            indexRequest.source("{ \"field1\" : \"value1\" }", XContentType.JSON);  
            bulkRequest.add(indexRequest);  
            // 添加delete操作  
            bulkRequest.add(new DeleteRequest("test", "2"));  
            // 发送bulk请求  
            BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);  
            if (bulkResponse.hasFailures()) {
     
                // 处理失败的操作  
                List<BulkItemResponse> failures = bulkResponse.getItems();  
                for (BulkItemResponse failure : failures) {
     
                    System.out.println("Failed operation: " + failure.getOpType() + " - " + failure.getFailureMessage());  
                }  
            } else {
     
                // 批量导入成功  
                System.out.println("Bulk import completed successfully.");  
            }  
        } catch (IOException e) {
     
            e.printStackTrace();  
        }  
    }  
}

19. es的文本相似度TF-IDF是什么?

简单地说,就是你检索一个词,匹配出来的文章,网页太多了。比如 1000 个,这些内容再该怎么
呈现,哪些在前面哪些在后面。这需要也有个对匹配度的评分。

是一种基于统计的文本处理方法,用于评估一个词在特定文档中的重要程度。其原理可以概括为:将一个词在文档中出现的次数(Term Frequency,TF)与该词在语料库中出现的次数(Inverse Document Frequency,IDF)相乘,得到该词在该文档中的TF-IDF值。

TF-IDF的具体计算方法如下:

  • 计算词频(TF):一个词在文档中出现的次数除以文档的总词数,得到该词在文档中的词频。词频越高,说明该词在文档中的重要性越高。
  • 计算逆文档频率(IDF):一个词在语料库中出现的次数除以语料库的总文档数,取对数得到该词的逆文档频率。逆文档频率越大,说明该词越稀有,越具有区分度。
  • 将TF和IDF相乘,得到该词在文档中的TF-IDF值。TF-IDF值越大,说明该词在文档中的重要性越高。

通过TF-IDF算法,可以将文档中的词进行权重化处理,从而为后续的文本分类、聚类和信息检索等任务提供更有价值的特征信息。

20. 如何实现es的master选举的?

Elasticsearch的master节点是集群中的主节点,负责管理集群状态和路由请求。在Elasticsearch中,master选举是通过集群内部的节点之间进行通信和协商来实现的。
步骤:

  • 配置节点:在每个Elasticsearch节点上,需要配置cluster.name参数,以便将节点分配给正确的集群。此外,需要设置node.master参数为true,以指定该节点作为master节点候选。
  • 节点启动:启动每个Elasticsearch节点时,它会尝试与其他已知的节点进行通信。每个节点都会发送一个“我是一个master”的消息,并等待其他节点的响应。
  • 投票选举:每个节点都会检查它与其他节点的通信,并确定哪些节点可以被选为master。如果一个节点收到了来自大多数节点的“我是master”的消息,那么它将认为自己是master节点。
  • 确认选举:一旦一个节点被选为master,它会发送一个“我是master”的消息给其他节点,并等待其他节点的确认。如果其他节点也认为该节点是master,那么选举过程就完成了。
  • 维护选举:如果master节点出现故障或不可达,其他节点将重新进行选举,并选出新的master节点。选举过程是自动的,并且会持续进行,以确保集群始终有一个可用的master节点。

需要注意的是,Elasticsearch的master选举是自动的,并且不需要手动干预。此外,为了确保集群的稳定性和可用性,建议在生产环境中使用多个master节点,并将它们配置为热备或冷备状态。这样可以减少单点故障的风险,并提高集群的可靠性。

21. 如果多个节点都向其他节点发送我是主master的信息。那么其他节点是怎么确定一个节点是主master的?

其他节点确定一个节点为主master的方式是通过比较节点的优先级。优先级可以通过多种方式设置,例如通过节点的IP地址或通过配置文件中的优先级值。在选举过程中,具有最高优先级的节点将被选为主master。如果多个节点具有相同的优先级,则根据节点的ID进行比较,ID较小的节点将成为主master。如果ID也相同,则根据时钟时间进行比较,时间较早的节点将成为主master。

22. es的api是什么?

Elasticsearch Java REST Client,它是官方的Java客户端,提供了与Elasticsearch进行交互的API。使用该库,可以方便地执行各种API操作,如检索、索引管理、数据更新等。

23. elk你了解么?

ELK是三个开源软件的缩写,分别是Elasticsearch、Logstash和Kibana。它们都是开源软件,用于构建实时日志分析系统。

  • Elasticsearch是一个分布式搜索和分析引擎,可以用于全文搜索、结构化搜索以及分析。它基于Apache Lucene构建,使用Java编写,支持RESTful风格的API。
  • Logstash是一个具有实时传输能力的数据收集引擎,用于收集、解析和传输数据。它可以用于日志管理、数据采集等场景,支持多种数据源和输出方式。
  • Kibana可以为Logstash和Elasticsearch提供分析和可视化的Web平台,支持在Elasticsearch的索引中查找、交互数据,并生成各种维度表格、图形。

这三个开源软件可以一起使用,形成一个完整的日志分析系统。Logstash可以从各种来源获取数据,经过处理后将其发送给Elasticsearch进行存储和搜索,而Kibana则提供了可视化和查询界面,方便用户查看和分析数据。

ELK系统的主要优势在于其可扩展性、灵活性和可靠性。它可以根据需求进行定制和扩展,支持大量的数据采集、处理和存储,并提供实时的分析和可视化功能。同时,由于这三个软件都是开源的,用户可以根据需要自由选择和修改代码,以满足特定的需求。

总之,ELK是一个强大而灵活的日志分析解决方案,广泛应用于日志管理和数据分析领域。它可以为开发者和企业提供实时的数据分析和可视化工具,帮助其更好地理解应用程序和系统的运行状况。

24. 你公司es的集群是怎么配置的?

面试官:想了解应聘者之前公司接触的 ES 使用场景、规模,有没有做过比较大规模的索引设计、规划、调优。实结合自己的实践场景回答即可。

前提四个月导入800w条数据,日增20+w,30列

es 的版本:Elasticsearch 6.x(2019年发布),该版本在性能和稳定性方面进行了改进,同时引入了新的功能和改进,包括Ingest Node, Split and Merge API等;
es有几个节点: 至少3个;
在几个服务器上:3个;
几个分片:5个主分片;
几个副本分片:每个主分片至少一个副本;
内存是多大的:至少16GB,推荐32GB;
索引数据的大小:每天每个索引大小控制在150GB;
数据节点:开始配置3-5个,根据增长情况逐步扩展;
协调节点:查询负载过高,可以设置1-2个;

25. es的使用场景,为什么要选es作为搜索引擎?

  • 全文搜索:Elasticsearch是一个功能强大的全文搜索引擎,可以高效地处理大量文本数据,并提供了强大的搜索和分析功能。
  • 结构化数据搜索:除了全文搜索,Elasticsearch也可以用于搜索结构化数据。通过使用Elasticsearch的查询DSL(领域特定语言),可以轻松地构建复杂的查询条件,实现对结构化数据的快速检索。
  • 实时分析:Elasticsearch提供了强大的聚合功能,可以对数据进行实时分析。通过使用聚合操作,可以对大量数据进行统计、分组、排序等操作,从而得到需要的结果。
  • 分布式系统:Elasticsearch是分布式搜索和分析系统,可以处理大规模数据集,并且能够自动进行负载均衡和分片处理。
  • 数据仓储和数据挖掘:Elasticsearch可以作为数据仓库和数据挖掘工具使用,通过缓存数据和减少对磁盘的IO操作,可以提高数据查询和分析的效率。
  • 实时日志分析:Elasticsearch可以用于实时日志分析,通过实时收集、存储和分析日志数据,可以帮助开发人员和运维人员快速定位和解决问题。
  • 推荐系统:基于Elasticsearch的推荐系统可以通过分析用户的行为和兴趣,为用户提供个性化的推荐服务。

26. es的聚合操作指的是什么?

ES的聚合操作指的是在搜索数据的基础上进行的一种数据分析操作。它可以对搜索结果进行分组、排序、过滤和计算,从而得出具有统计意义的结果。

具体来说,聚合操作可以用于以下方面:

  • 桶聚合:将数据分成不同的组,并对每个组进行统计。例如,对某个字段进行桶聚合,可以得出每个桶中的数据量、平均值、最大值、最小值等统计信息。
  • 指标聚合:对数据进行统计和计算,得出具有统计意义的指标。例如,计算某个字段的平均值、求和、最大值、最小值等。
  • 过滤操作:在聚合过程中,可以使用过滤器对数据进行筛选,只对符合条件的文档进行聚合。
    多值聚合:返回多个值,例如分组计数、分段统计等。

27. es写入异常,或者写入缓慢怎么排查解决?

  • 内存参数配置不合理:是否给Elasticsearch实例足够的内存,如果内存足够的话,建议配置30GB每个Elasticsearch数据实例节点。

  • bulk提交量过大,导致内存被堆满:一次提交的bulk数量不宜过大,实践证明5-10MB左右大小合适。

  • 客户端IP,端口配置问题:因为Elasticsearch的客户端采用的是轮询的方式,所以尽量配置所有节点的IP、端口,或者开启嗅探功能。

  • 写入时指定DOC ID,导致读IO高:写入时指定DOC ID,意味着首先需要判断ID是否重复,如果在大数据量的场景下,可能会需要从磁盘进行一次读操作,从而占用大量的磁盘IO,导致写入速度慢。

  • bulk队列积压,请求线程被拒绝:大量的bulk队列被等待或者积压,导致线程被拒绝,这时候需要适当降低业务请求的并发量。

  • 热分片问题:单个索引的分片集中分布在某几个机器节点上,导致写入压力无法均匀地分布到各个机器节点上,形成阻塞的问题。

  • 集群不稳定,大量分片迁移和恢复:如果你的集群处于不稳定的状态,比如有大量的分片在做均衡迁移或者恢复,都会占用大量的资源,导致写入资源被占用。

  • 部分实例长时间不断的full gc,导致实例处于假死状态:部分场景下,数据实例处于长时间不断的full gc,但此时并没有完全脱离集群,写入请求仍然往这个节点发送,此时节点已经无法处理了。快速解决办法:重启问题实例。

  • 磁盘IO瓶颈:当磁盘出现IO瓶颈,能怎么办呢,换更好的盘??,或者扩容吧。

  • 查询业务占用大量的资源:高并发的查询或者大数据的查询可能会占用大量的资源,此时需要衡量你的系统侧重点了,实在不行,扩容吧。

  • 索引段合并占用大量的IO资源:索引段合并太频繁同样会占用大量的IO资源,如果不是SSD盘,将索引段合并线程设置为1。

  • 分词器设计不合理:不同的分词对写入影响很大,分词器设计不合理,可能会存在大量的CPU计算和过度分词等问题。

28. es 一共5m的存储空间,你存了4m,还想存3m,怎么存?

  • 清理旧数据:首先,你可以考虑清理一些旧的、不再需要的数据,以释放存储空间。这可以通过删除旧索引或者使用_delete_by_query API来删除匹配特定条件的文档。
  • 增加存储空间:如果清理旧数据无法满足存储需求,你可以考虑增加更多的存储空间。这可以通过添加更多的节点或者在现有节点上增加更多的磁盘空间来实现。
  • 优化索引设置:如果存储空间仍然不足,你可以考虑优化索引的设置。例如,可以调整分片数量、副本数量等参数,以更好地利用存储空间。
  • 使用压缩:Elasticsearch支持对索引数据进行压缩,以减少存储空间的需求。你可以使用默认的压缩算法或者自定义的压缩算法来压缩数据。

29.为了保证线上可用,导入的时候是怎么操作的?

  • 数据备份:在进行数据导入之前,先对原始数据进行备份,以防止数据丢失或导入过程中出现意外情况。
  • 导入工具选择:选择合适的导入工具,如Logstash、Filebeat等,这些工具可以帮助你高效地导入数据到Elasticsearch中。
  • 分批导入:将数据分批导入,而不是一次性导入所有数据。这样可以减少单次导入的数据量,减轻系统压力,并提高导入的稳定性和成功率。
  • 限流控制:在数据导入过程中,可以使用限流控制来限制写入速率。这样可以避免对Elasticsearch集群造成过大的负载,保证系统的稳定性。
  • 健康检查:在导入过程中,定期检查Elasticsearch集群的健康状态,包括节点的CPU、内存、磁盘等资源使用情况以及索引的状态等。如果发现异常情况,可以及时进行处理。
  • 回滚机制:在数据导入过程中,如果发现错误或异常,可以回滚到之前的状态,重新进行数据导入。这样可以保证数据的完整性和一致性。
  • 监控与日志:使用Elasticsearch提供的监控工具和日志分析工具,实时监控集群的状态和日志信息。这样可以及时发现和解决问题,保证导入过程的顺利进行。

相关推荐

  1. 中间件面试ElasticSearch

    2024-01-21 04:20:01       22 阅读
  2. Elasticsearch面试

    2024-01-21 04:20:01       23 阅读
  3. ElasticSearch面试

    2024-01-21 04:20:01       38 阅读
  4. 面试分享——Elasticsearch面试

    2024-01-21 04:20:01       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-21 04:20:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-21 04:20:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-21 04:20:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-21 04:20:01       20 阅读

热门阅读

  1. SpringBoot-03

    2024-01-21 04:20:01       37 阅读
  2. C++中的new/delete

    2024-01-21 04:20:01       40 阅读
  3. Spring DI

    Spring DI

    2024-01-21 04:20:01      37 阅读
  4. 有了指令集架构, 到完成CPU成品还有多远距离

    2024-01-21 04:20:01       39 阅读
  5. 初识VUE

    初识VUE

    2024-01-21 04:20:01      39 阅读
  6. 【RHCE服务搭建实验】之NFS

    2024-01-21 04:20:01       38 阅读
  7. LeetCode 46 全排列

    2024-01-21 04:20:01       40 阅读
  8. leetcode 哈希表相关题目

    2024-01-21 04:20:01       39 阅读
  9. leetcode-2719统计证书数目

    2024-01-21 04:20:01       40 阅读