2.Elasticsearch使用优化原理总结

本文详细介绍了Elasticsearch的集群类型、节点角色,如master、data、coordinating、ingest和machinelearning节点。探讨了数据类型、索引动态设置、Mapping结构以及分片策略,强调了分片数量对性能的影响。同时,讨论了查询优化、读写流程、集群参数配置和底层原理,包括数据结构和算法,以及Elasticsearch的设计模式应用。
摘要由CSDN通过智能技术生成

一、集群类型

负载均衡集群LB集群:Elasticsearch集群中每个节点都是marster节点、也是date节点。 此类集群是追求吞吐量,在处理故障转移、热点请求、预处理稍微弱。

读写分离集群:Elasticsearch集群中部分节点是Marster节点,部分节点是data节点。Marster节点负责整个集群的管理者、索引管理、分片管理,以及整个集群的状态的管理。data node:数据节点,存储主要数据,负责索引的数据的检索和聚合等操作。 此类集群在故障转移要比第一类集群好。

协调节点集群:Elasticsearch集群有Marster节点、Date节点、coordinating节点。 coordinating节点主要处理请求接收转发、date响应数据处理。协调节点工作压力是相当大的,当系统资源不足的时候,coordinating节点可能会被干死,协调节点启动集群不需要做数据同步,可以快速回复可使用状态。

二、集群节点

单个 Elasticsearch 实例。 在大多数环境中,每个节点都在单独的盒子或虚拟机上运行。一个集群由一个或多个 node 组成。在测试的环境中,我可以把多个 node 运行在一个 server 上。在实际的部署中,大多数情况还是需要一个 server 上运行一个 node。根据 node 的作用,可以分为如下的几种:

1、master node节点

整个集群的管理者、索引管理、分片管理,以及整个集群的状态的管理,master节点是从master候选节点中选出的,成为master候选节点的方式:node.master:true 默认(true)
data node:数据节点,存储主要数据,负责索引的数据的检索和聚合等操作,设置data node的方式如下:

node.master:true
node.data:false

2、data node节点

该节点和应用创建连接、接收索引请求,会存储分配在该node上的shard的数据并负责这些shard的写入、查询等,ES集群的性能取决于该节点的个数(每个节点最优配置的情况下),data节点会占用大量的CPU、io和内存;data节点的分片执行查询语句、获得查询结果后将结果反馈给Coordinating,此过程较消耗硬件资源;设置成为data节点的方式

node.data:true
node.master:false

3、coordinating node节点

协调节点,所有节点都可以接受来自客户端的请求、并转化给date节点、接收date节点响应处理数据,因为每个节点都知道集群的所有索引分片的分布情况,但是别的节点,都还肩负着别的工作,如果请求压力过大,可能会拖垮整个集群的响应速度,所以就专门有了这个协调节点,他什么都不用做,只处理请求和请求结果,这种设计的好处是,如果集群资源不足,被干死的是coordinating node, marster、data节点安全,设置成为coordinating node节点的方式:

node.data:false
node.master:false

4、ingest node节点

预处理节点,主要是对数据进行预处理,比如对字段重命名,分解字段内容,增加字段等,类似于Logstash, 就是对数据进行预处理,ingest里面可以定义pipeline(管道),pipeline可以由很多个processor(官方预定义28个)构成,用来出来预处理数据,使用方式:先定义好预处理pipeline,然后在存储数据的时候指定pipeline,如:成为ingest node的方式

 node.ingest:true 默认(true)

5、machine learning (Gold/Platinum License)节点

顾名思义,机器学习节点执行 ML 算法并检测异常。 它是商业许可证的一部分,因此你必须购买 XPack 许可证才能启用机器学习功能。关于 Elastic Stack 的订阅,详细请参阅链接 订阅 | Elastic Stack 产品和支持 | Elastic。

6、Transform node节点

严格地说, transform 节点角色是列表中的最新成员。 它用于数据的汇总。 此节点是执行 transform API 调用所必需的,这将创建(转换)基于现有索引进行透视的新索引。

三、数据类型

Text 类型:适用于需要进行全文搜索的字段,如文章、博客、游戏说明等。

Keyword 类型:适用于需要精确匹配的关键字字段,如标题、标签、状态等。

数值类型:例如:(Long、Integer、Short、Byte、Double、Float、Half Float、Scaled Float)适用于需要对数值进行统计分析的字段,如订单金额、用户积分等。

Date 类型:适用于需要排序或筛选日期的字段,如发布时间、创建时间等。

Boolean 类型:适用于只有 true 或 false 两种状态的字段,如是否开启某项功能等。

Binary 类型:适用于需要存储图像、音频、视频等二进制数据的字段。

Range 类型:适用于需要对范围值进行过滤、排序或聚合的字段,如价格区间、时间范围等。

Object 类型:适用于需要将多个字段组合成一个对象的场景,如用户信息、地址信息等。

Array 类型:适用于需要存储一个或多个具有相同数据类型的值集合的场景,如商品标签、用户兴趣爱好等。

Geo-point:查询两个点位距离的场景。

Geo-shape:适合查询区域面 包含、相交,地理形状的场景。

四、index索引

1、索引static设置

index.number_of_shards:主分片数量,默认1
index.number_of_routing_shards:拆分索引的路由分片数量,默认值位于2~1024之间,依赖索引主分片数量
index.shard.check_on_startup:打开前检查分片是否损坏,默认false
index.codec:压缩存储算法,默认LZ4
index.routing_partition_size:自定义路由可以到达的分片数量,默认1

注意:只能在创建索引时或关闭的索引上设置

2、索引dynamic设置

index.number_of_replicas:主分片的副本数,默认1
index.auto_expand_replicas:根据集群中数据节点的数量自动扩展副本的数量,默认false
index.search.idle.after:搜索空闲之前不能接收搜索和获取请求的时间,默认30s
index.refresh_interval:刷新操作频率,最近对索引的更改既可见,默认1s。-1关闭刷新操作
index.max_result_window:查询索引结果的最大数量,默认10000
index.max_inner_result_window:内部或聚合命中最大数量,默认100
index.max_rescore_window:打分请求的最大索引数量,默认10000(同index.max_result_window)
index.max_docvalue_fields_search:查询中允许的最大字段数,默认100
index.max_script_fields:查询中允许的最大脚本字段数,默认32
index.query.default_field:查询返回的默认字段,默认*(表示所有)

注意:可以使用API实时对索引进行操作

3、Mapping结构

Elasticsearch Mapping(映射)是描述 Elasticsearch 索引中的文档结构的方式。它定义了索引中哪些字段存在以及每个字段的属性和数据类型。以下是关于 Elasticsearch Mapping 的一些常见问题及其答案:

1、什么是 Elasticsearch Mapping?

Elasticsearch Mapping 是一种定义索引中文档结构的方式。它描述了每个字段的名称、数据类型、存储方式、索引方式、分析器等属性,帮助 Elasticsearch 了解文档中的数据,从而更好地执行搜索和聚合操作。

2、Mapping 中可以定义哪些属性?

在 Elasticsearch Mapping 中,可以定义文档中每个字段的数据类型、存储方式、索引方式、分析器等属性。具体来说,这些属性包括:

  • 数据类型:字符串、整数、浮点数、布尔值、日期等;
  • 存储方式:是否存储源文档、存储方式等;
  • 索引方式:是否被索引、索引时采用何种分析器、是否采用倒排索引等;
  • 其他:是否规范化、是否是多值字段等。
3、Elasticsearch Mapping 有什么作用?

Elasticsearch Mapping 用于描述文档结构,它可以帮助 Elasticsearch 更好地理解文档中的数据。具体来说,它的作用包括:

  • 增强搜索功能:当索引了某些字段时,Elasticsearch 可以更有效地执行搜索,提高搜索效率;
  • 精准聚合分析:在合适的 Mapping 下,Elasticsearch 可以在聚合分析中更准确地计算指标和度量,获得更精确的结果;
  • 提高性能:在 Mapping 上使用适当的字段类型和存储设置,可以提高数据的索引速度和查询速度。
4、如何定义 Elasticsearch Mapping?

可以使用 Elasticsearch 的 API 或者语言特定的客户端库来定义 Elasticsearch Mapping。可以通过手动定义 Mapping 或者自动创建 Mapping 来定义索引的文档结构。手动定义 Mapping 需要使用 PUT 等命令,而自动创建 Mapping 则可以让 Elasticsearch 自动根据文档中的数据类型进行推断和创建。

5、如何修改 Elasticsearch Mapping?

如果已经定义了 Mapping,想要修改 Mapping 可能会比较棘手。由于 Mapping 一旦被设置就无法修改,因此只能通过重建索引的方式进行修改。为了避免数据丢失,可以使用 Elasticsearch 提供的 reindex API 完成重建索引的过程。

五、document文档

Elasticsearch是面向文档的,文档是ES的最小单元。文档Elasticsearch 中有一些重要的属性:它是独立的。文档包含字段(名称)及其值,每个文档都有自己的唯一ID,文档可以是最简单的JSON,也可以是嵌套层级很深的JSON。

六、分片策略

每个索引都是由分片组成的,可能是一个可能是多个,每个分片还可能有对应的副本,以便应对硬件故障。Elasticsearch 中存储的最小单元也是分片,一个分片实际上是一个完整的 Lucene 索引。

1、为什么分片?

单个节点上可以存储的数据量是有限的,因此可以通过添加节点和增加索引的分片数增加可存储容量。由于分片的数量是一个静态配置项,只可以在创建索引时指定分片数中途不能更改,因此在创建索引前必须小心的做好规划,设置一个合理的分片数。

3、分片设置过多的危害?

如果设置过多的分片,在读取的时候,需要从多个分片读取数据,然后在聚合数据。在写入数据时,需要将数据划分到过多的分片,搜索时可能会导致集群对搜索的响应效率较低,在极端情况下甚至可能变得不稳定。

4、分片设置过少的危害?

如果设置了过少的分片,可能随着数据量的增加,单个分片过大,在发生故障恢复时,可能会花费更长的时间(还可能导致集群各节点的磁盘占用水平不一致,有的磁盘占用率低,有的占用率高,随着业务发展,后期可能会经常触发分片重分配)。如果查询一点数据命中一个大分片,不利于快速寻找到目标数据。

5、设置分片需要考虑那些问题?

分片可以移动但不可分割,数量不可以调整。因此在创建索引时,选择一个合理的分片数是很重要的。除了站在单个索引的角度,还需要站在集群的角度考虑,例如集群的容量,某个节点的容量,单个节点最多可以持有多少个分片.

6、设置分片需要考虑那些问题?

6.1、搜索时每个分片一个线程
大部分的搜索都会命中多个分片。每个分片都会一个CPU线程上执行搜索。虽然一个分片上可以运行多个并发的搜索,但跨大量分片的搜索可能会耗尽节点的搜索线程池。这可能导致吞吐量低和搜索速度慢。

6.2、每个索引和分片都有开销
每个索引和分片都会占用一定的内存和CPU资源。大部分情况下,一些大分片比很多小分片占用的资源更少。分片的资源占用主要是其对应的分段。每个分片都对应着一些分段,用于存储索引数据。为了能够更快的检索,Elasticsearch将分段的元数据存储于JVM的堆内存中。随着分片变大,它的分段会合并为更大的分段,分段数量减少,意味着更少的元数据存在于JVM堆中。每个映射的字段也会带来一些内存和磁盘的开销。默认情况下,Elasticsearch会为索引的每个文档的每个字段的创建映射,也可以关闭。

6.3、集群自动平衡分片的存储
集群的节点被到数据层中。Elasticsearch尝试将索引的分片分布在尽可能多的节点上。当添加新节点或节点故障时,Elasticsearch会自动在其余节点上重新平衡索引的分片。

7、分片最佳实践

7.1、分片大小保持在10GB-50GB之间

分片大小保持在10GB-50GB之间,大的分片在故障恢复时会占用较长的时间。当某个节点发生故障时,Elasticsearch会根据剩余节点的数据自动的重新平衡分片。恢复进程通常是在网络之间拷贝分片的内容,因此一个100GB的分片会比50GB的分片花费更多的时间。相比之下,小分片的开销更大,搜索效率也更低。搜索50个1GB分片将比搜索一个包含相同数据的50GB分片占用更多资源。分片的大小并没有强制的限制。但经验值是10-50GB之间的分片通常在日志和时间序列的数据流索引上表现更好。 总结:打分片性能好,故障恢复慢,小分片性能差,故障恢复快。

7.2、每GB堆内存对应少于20个分片

数据节点可以容纳的分片数与节点的堆内存成比例。例如,具有30GB堆内存的节点最多应该有600个分片。越是低于此比例,就越能保持节点性能。如果发现节点超过每GB 20个以上的分片,请考虑添加另一个节点。单节点分片数计算=JVM堆大小*20

7.3、避免节成为热点

如果分配给特定节点的分片太多,该节点可能会成为热点。例如,如果单个节点包含的分片太多,索引量太大,则该节点可能会出现问题。

七、查询优化

Elasticsearch 查询场景一般使用SQL方式。 其内置的DML语法很难用。如果涉及性能优化,可以将SQL翻译成为DML然后在进行优化,下面讲DML如何优化。

1、一般查询Query优化

选择合适的 Query 类型:不同类型的查询会对性能产生不同的影响,因此需要根据具体情况选择合适的 Query 类型。例如,根据关键字进行全文搜索时,match 查询的性能通常优于 term 查询,但是需要注意的是,在查询数值类型等精确匹配要求较高的字段时,term 查询要优于 match 查询。

2、聚合复杂查询优化

  1. 使用复合查询:在进行复杂查询时,可以使用复合查询来加速查询性能,比如将多个查询组合成一个 bool 查询、dis_max 查询等。使用复合查询可以避免多次查询,减少了网络延迟,提高了查询性能。

    //待转化Sql
    SELECT * FROM test_tbl WHERE name = '小明' AND age = 20 ORDER BY name;
    
    //转化为DML语句, 此DML按照1,2规则优化
    GET /test_tbl/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "name": "小明"
              }
            },
            {
              "term": {
                "age": 20
              }
            }
          ]
        }
      },
      "sort": {
        "name": "asc"
      }
    }
    

3、使用缓存优化

  1. 缓存频繁使用的查询:Elasticsearch 会对频繁进行查询的数据进行缓存,以提高查询速度。可以通过设置 index.queries.cache.enabled 参数来控制查询缓存的开启和关闭。

4、综合优化

  1. 调整 Elasticsearch 集群的资源:具体来说,可以优化 Elasticsearch 集群的 CPU、内存和磁盘等资源,以提高查询速度。例如,可以增加节点数、增加索引副本数等。
  2. 针对大型数据集的查询,可以使用分页查询、聚合查询、查询缓存等技术。在聚合查询中,可以使用搜索过滤器对搜索结果进行大规模过滤,提升查询效率。
  3. 调整 Elasticsearch 的索引设置:通过改变 Elasticsearch 的索引设置,例如忽略停用词、调整词频等,可以对查询性能产生很大的影响。另外,对不同字段进行不同的索引设置,也能有效的提高性能。

八、读写流程总结

1、读流程

Elasticsearch 读取数据的流程如下:

  1. 客户端向 Elasticsearch 发起查询请求。

  2. 请求到达负载均衡器(Load Balancer),负载均衡器根据算法选择一个节点并将请求转发给该节点。

  3. 节点接收到请求,将其传递给协调节点(Coordinating Node)。

  4. 协调节点根据请求的查询语句,检索的 shard 等信息,向包含有相关 shard 的数据节点(Data Node)发起请求。

  5. 数据节点从自身维护的 shard 中读取数据,将结果返回给协调节点。

  6. 协调节点将多个数据节点返回的结果进行聚合、分析等操作。

  7. 数据节点返回结果给协调节点,协调节点将结果返回给负载均衡器,响应到客户端。

2、写流程

1、ES写流程
  1. 客户端向 Elasticsearch 发起写入请求。
  2. 请求到达负载均衡器(Load Balancer),负载均衡器根据算法选择一个节点并将请求转发给该节点。
  3. 节点接收到请求,将其传递给协调节点(Coordinating Node)。
  4. 协调节点根据请求的索引名称和文档 ID 等信息,计算出该文档所在的 shard。如果该 shard 已经存在于本节点,那么直接将请求转发到该 shard 所在的数据节点上;否则,协调节点将请求转发给包含有该 shard 副本的数据节点。
  5. 数据节点接收到请求,将文档写入内存缓存中。在内存缓存中,Elasticsearch 会使用一些数据结构对文档进行索引,例如倒排索引等。
  6. 当文档在内存缓存中达到阀值后,数据节点会将其刷写到磁盘中。在磁盘上,Elasticsearch 采用 Lucene 索引库对文档进行存储和索引。
2、ES 写 与 segment关系

在 Elasticsearch 写流程中,segment 是一个非常重要的概念,它代表了 Lucene 索引中的一个分段。每当一些文档写入 Elasticsearch 时,Elasticsearch 会将这些文档存储到内存缓存中,称为 Memory Buffer。当 Memory Buffer 的大小达到一定的阀值时,Elasticsearch 会将 Memory Buffer 转化为一个个 segment,然后将其写入到磁盘上的 Lucene 索引中,称为 Disk Segment。

因此,Elasticsearch 的写流程可以分为以下几个阶段:

  1. 内存缓存中的写入阶段:当文档写入 Elasticsearch 时,它们首先会被写入到内存缓存中。这个内存缓存被称为 Memory Buffer。当 Memory Buffer 的大小达到一定程度时,Elasticsearch 会将其刷写到磁盘中,并创建一个新的 Memory Buffer。

  2. Memory Buffer 到 segment 的转化阶段:当 Memory Buffer 的大小达到一定的阈值时,Elasticsearch 会将其转化为一个个 segment。一个 segment 保存了一个有序的、不可变的词典列表。词典列表中包含了每个 term 出现的位置信息。每个 segment 是一个较小的文件,且由可变(Volatile)内存映射到磁盘,以限制内存占用和硬盘 I/O。

  3. segment 的写入阶段:在 Memory Buffer 被转化为 segment 后,Elasticsearch 会将这些 segment 写入到磁盘上的 Lucene 索引中,称为 Disk Segment。由于 Elasticsearch 使用 Lucene 索引库对文档进行索引和存储,因此 Disk Segment 中包含了非常有意义的信息,用于搜索和分析操作。

  4. segment 的合并阶段:当多个 segment 被写入到 Lucene 索引中时,它们占用了磁盘上的大量空间。因此,Elasticsearch 需要定期对这些 segment 进行合并操作,以减少磁盘空间的占用。合并后的 segment 称为 Merged Segments。

九、Elasticsearch集群参数配置

1、JVM 配置参数

1. 初始化堆大小参数:
Xms: 设置初始堆大小(默认为 1GB)。
Xmx: 设置最大堆大小(默认为物理内存的一半)。

2. 堆外内存参数:
XX:MaxDirectMemorySize:设置直接内存的最大大小(默认为-XX:MaxHeapSize,即最大堆大小的一半)。

3. 垃圾收集器参数:
XX:+UseG1GC:启用 G1 垃圾收集器(默认为 CMS 收集器)。

4. 并发度参数:
XX:ParallelGCThreads:设定垃圾回收阶段并行线程数。
XX:ConcGCThreads:设定垃圾回收阶段并发线程数。

5. JIT 参数:
XX:CompileCommandFile:指定一个纯文本文件,并包含要在 JIT 编译期间编译的方法。

6. 签名文件限制参数:
Djdk.attach.allowAttachSelf:允许 JVM 通过 Attach API 自动附加到主机 JVM 实例。

2、集群配置参数

cluster.name:集群名称,用于支持多个 Elasticsearch 集群。
node.name:节点名称,用于标识集群中的节点。
node.master:指定节点是否可以成为主节点。默认值是 true,表示节点可以成为主节点;如果该值设置为 false,则该节点不会成为主节点。
node.data:指定节点是否存储数据。默认值是 true,表示节点存储数据;如果该值设置为 false,则该节点不会存储数据。
path.data:存储索引的目录,默认值是 /var/lib/elasticsearch。
path.logs:存储日志文件的目录,默认值是 /var/log/elasticsearch。
bootstrap.system_call_filter:该参数是一个可选的安全性参数,用于设置操作系统调用过滤器以提高系统安全性。

3、网络配置参数

network.host:该参数指定 Elasticsearch 监听的 IP 地址和主机名。默认值是本地回环地址 (127.0.0.1)。

network.bind_host:该参数指定 Elasticsearch 服务监听的 IP 地址。默认值是 0.0.0.0,表示接受来自任何主机的连接。

network.publish_host:该参数指定节点之间通信时使用的 IP 地址。

http.port:该参数指定 Elasticsearch 的 REST API 的 HTTP 端口。默认值为 9200。

http.max_content_length:指定 HTTP 请求最大允许的字节数。

4、安全性配置参数

xpack.security.enabled:该参数启用或禁用 Elastic Stack 安全功能。默认值为 false。

xpack.security.transport.ssl.enabled:该参数启用或禁用 Elasticsearch 之间的 SSL 加密通信。默认值为 false。

xpack.security.authc.realms:该参数指定哪些身份验证实现被安装。

5、集群发现参数

discovery.type:该参数指定 Elasticsearch 在集群中查找其他节点的方式。

discovery.seed_hosts:该参数定义一个包含可用主机列表的数组,以便 Elasticsearch 可以发现集群中的其他节点。

discovery.zen.minimum_master_nodes:该参数是一个安全配置参数,用于控制在 Elasticsearch 集群中选举主节点所需的最小节点数。

6、索引参数

index.number_of_shards:该参数指定新建索引的默认分片数。默认值为 5。

index.number_of_replicas:该参数指定新建索引的副本数量。默认值为 1。

index.refresh_interval:该参数指定 Elasticsearch 必须在多长时间内自动刷新索引。默认值为 1 秒。

7、性能参数

thread_pool.bulk.queue_size:该参数指定了用于处理批量操作的线程数量。

thread_pool.bulk.size:该参数指定了用于处理批量操作的线程池最大容量。

thread_pool.search.size:该参数指定了用于搜索查询的线程池最大容量。

indices.fielddata.cache.size:该参数指定了缓存字段数据所需的内存量。

indices.memory.index_buffer_size:该参数控制了 Elasticsearch 使用的索引缓冲区的最大内存量。

indices.memory.min_index_buffer_size:该参数指定了每个节点的 Elasticsearch 索引缓存的默认最小大小。

indices.memory.min_shard_index_buffer_size:该参数指定了每个分片 Elasticsearch 索引缓存的默认最小大小。

8、时区设置

-Duser.timezone=Asia/Shanghai: 全局设置为东八区,默认为格林治时间。

十、Elasticsearch底层原理

1、数据结构

Elasticsearch 使用了多种不同的数据结构用于存储数据,这些数据结构都是经过了优化以适应大规模数据处理和高效查询的特点。

1、倒排索引&Trie树

倒排索引是 Elasticsearch 中的核心数据结构,用于在文本字段中存储词项和它们的位置信息。倒排索引可以快速地查找包含特定回答的文档,并且常用于文本搜索和全文检索等应用。例如在 ElasticSearch 搜索引擎中,使用倒排索引来存储文档和单词之间的映射关系,然后使用 Trie 树来存储这些单词的前缀,从而实现高效的自动补全功能。 倒排索引是文档映射关系,trie树是一种二叉树算法,不过他们思想是相通的

2、B+ Tree

B+ Tree:B+树是一种常用的平衡树,用于存储排序的数据。在 Elasticsearch 中,B+树被用来存储和管理基于数值的字段,例如日期、数字。

3、geohash

GeoHash grid:地理哈希网格是一种将地球划分为网格的方式,每个网格被编码到一个唯一的 geohash 值中,而每个值对应一个范围,从而允许用 geohash 值快速地搜索在一个给定范围内的点。

4、HyperLogLog

HyperLogLog:用于实现基数估计的Probabilistic数据结构,Elasticsearch 中使用它来估计查询结果相关的唯一值数量。计算搜索相关度

2、使用算法

1、HyperLogLog (HLL) 算法

HyperLogLog 算法是一种用于处理大数据流中唯一值计数的算法。它基于概率统计理论,能够高效地估计数据集中不同元素的数量,并且只需要消耗非常少的内存空间。在 Elasticsearch 的聚合查询中,HLL 算法常用于基数估计,例如计算某个字段的唯一值数量。

2、MinHash 算法

MinHash 算法是一种经典的近似近邻搜索算法,它可以在大规模数据集上高效地寻找相似的样本。在 Elasticsearch 中,MinHash 算法常用于实现最小唯一值聚合。

3、t-Digest 算法

t-Digest 算法是一种紧凑的统计算法,可以在大型数据集上高效计算百分位数、中位数等统计指标。在 Elasticsearch 的聚合查询中,t-Digest 算法通常用于计算数值型字段的百分位数或者分散程度。

4、Geohash 算法

Geohash 算法是一种将二维地理位置编码为一维字符串的方法,通过将地理位置编码为字符串,可以快速方便地对地理位置进行搜索和聚合。在 Elasticsearch 中,Geohash 算法常用于实现地理位置聚合,例如计算某个区域内的地理点数量。

3、文件管理方式

Elasticsearch 文件结构的管理基于 Lucene 的文件结构管理,也被称为 Lucene index。每个 Elasticsearch 索引都会被分配到一个或多个分片上,每个分片都是一个独立的 Lucene index。Elasticsearch 通过这种分片方式实现了数据的分布式存储和并行处理。

在每个分片上,Elasticsearch 使用 Lucene 提供的倒排索引(Inverted Index)存储数据,倒排索引是一种用于快速查找文档的数据结构,它将每个词项映射到一个由文档列表组成的数据结构中。除此之外,Elasticsearch 还使用了一系列的数据结构来优化查询,例如 Doc Values、Field Data、Caches 和 Filters 等。

在每个分片中,Lucene 会为每篇文档建立一个文档编号,这个文档编号不同于文档本身的 ID,它用于在倒排索引中快速定位文档。文档内容经过词法分析并转化为一系列的词项后,每个词项都会被存储到倒排索引中,并与相应的文档编号建立映射关系。

当用户执行查询时,Elasticsearch 会将查询语句转化为一个查询对象,并使用查询对象在倒排索引中查找匹配的文档,并进行相应的排序和分析,最终生成结果并返回给用户。

4、设计模式

Elasticsearch 使用 Java 设计模式包括:

  1. 单例模式(Singleton Pattern)

单例模式可以确保 Elasticsearch 的核心组件只被实例化一次,并在应用程序中全局使用。例如,Elasticsearch 中的节点分片分配器(NodeShardAllocator)组件就只有一个实例,用于分配节点的分片。

  1. 工厂模式(Factory Pattern)

工厂模式可以根据不同的条件创建不同的对象。在 Elasticsearch 中,ShardRouting和SearchShard类就是通过节点的工厂方式来创建的。

  1. 适配器模式(Adapter Pattern)

适配器模式可用于将来自不同数据源的数据统一到一个框架中进行处理。在 Elasticsearch 中,通过适配器模式可以支持不同的数据格式,例如 JSON、XML 等格式。

  1. 观察者模式(Observer Pattern)

观察者模式可以监控一个对象以便在对象状态改变时及时通知其它对象。Elasticsearch 中的插件更新器就是使用观察者模式来通知插件状态的变化。

  1. 迭代器模式(Iterator Pattern)

迭代器模式提供了一种遍历一组对象的方法,而不必了解这组对象的内部实现。在 Elasticsearch 中,查询 API 中的 Scroll和SearchScroll 组件就是使用迭代器模式来遍历搜索结果的。

  1. 策略模式(Strategy Pattern)

策略模式可以根据不同的策略选择不同的算法来完成一个任务。在 Elasticsearch 中,搜索查询中的 QueryParseContext 组件就使用了策略模式来解析不同的查询条件。

用于将来自不同数据源的数据统一到一个框架中进行处理。在 Elasticsearch 中,通过适配器模式可以支持不同的数据格式,例如 JSON、XML 等格式。

  1. 观察者模式(Observer Pattern)

观察者模式可以监控一个对象以便在对象状态改变时及时通知其它对象。Elasticsearch 中的插件更新器就是使用观察者模式来通知插件状态的变化。

  1. 迭代器模式(Iterator Pattern)

迭代器模式提供了一种遍历一组对象的方法,而不必了解这组对象的内部实现。在 Elasticsearch 中,查询 API 中的 Scroll和SearchScroll 组件就是使用迭代器模式来遍历搜索结果的。

  1. 策略模式(Strategy Pattern)

策略模式可以根据不同的策略选择不同的算法来完成一个任务。在 Elasticsearch 中,搜索查询中的 QueryParseContext 组件就使用了策略模式来解析不同的查询条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值