当前位置: 首页 > article >正文

ElasticSearch 的工作原理

理解 ElasticSearch 的工作原理需要从索引、搜索、以及其背后的核心机制几个方面来探讨。


1. ElasticSearch 是什么?

ElasticSearch 是一个分布式搜索和分析引擎,适用于各种类型的数据,例如文本、数值、地理位置、结构化或非结构化数据。它基于 Apache Lucene 构建,提供高效的全文本搜索能力。


2. 数据的写入与索引

(1) 数据写入
  • 文档存储: 数据以 JSON 格式的文档写入。
  • 索引:
    • 文档属于一个索引(类似于数据库中的表)。
    • 每个文档由一个唯一的 _id 标识。
  • 分片机制:
    • 一个索引被划分为多个分片(shards),每个分片可以分布在不同的节点上。
    • 分片提供了水平扩展能力。
    • 每个分片有主副本和副本分片,提供数据高可用性。
(2) 倒排索引

倒排索引是 ElasticSearch 的核心结构,用于快速查找包含某个词的所有文档:

  1. 文档的每个字段被分词器(Analyzer)拆分成单个的词条(terms)。
  2. 构建词条到文档的映射。
  3. 例如:
    • 文档 1:ElasticSearch is fast.
    • 文档 2:Fast search with ElasticSearch.
    • 倒排索引:
      fast -> [1, 2]
      ElasticSearch -> [1, 2]
      search -> [2]
      

3. 数据写入流程

  1. 写入内存缓冲区和事务日志(Translog):
    • 数据先写入内存中的缓冲区,同时写入磁盘上的事务日志,用于故障恢复。
  2. 段(Segment)生成:
    • 定期(默认 1 秒)刷新(refresh),将缓冲区的数据写入段文件(不可变)。
    • 每个段中包含倒排索引。
  3. 段合并:
    • 为了减少小段的开销,ElasticSearch 会定期合并小段为大段,释放旧段占用的资源。

4. 数据的搜索

搜索使用分布式处理,流程如下:

  1. 路由到分片:
    • 请求被路由到对应的分片(主分片或副本分片)。
  2. 分片内查询:
    • 每个分片查询其本地的倒排索引,返回匹配结果。
  3. 合并结果:
    • 主节点从各分片汇总结果,根据相关性或排序规则生成最终结果。

5. 核心特性

(1) 近实时搜索(NRT)
  • 数据写入后并非立即可搜索,而需要等待刷新。
  • 刷新间隔(默认 1 秒)可通过 refresh_interval 配置。
(2) 分布式架构
  • 分片与副本分布在不同节点,提供高可用性和扩展性。
(3) 分析功能
  • ElasticSearch 不仅用于搜索,还支持聚合(aggregation)分析。

6. 优化与实践

  • 调整分片数: 根据数据规模和集群节点调整分片数。
  • 调整刷新间隔: 根据业务需求调整 refresh_interval
  • 使用批量操作: 批量写入(bulk API)提高写入效率。
  • 设置合适的映射(Mapping): 为字段指定类型、分词器,提升搜索性能。

通过这些机制和优化,ElasticSearch 能快速索引和搜索海量数据,适应各种业务场景需求。


http://www.kler.cn/a/452767.html

相关文章:

  • <C++> XlsxWriter写EXCEL
  • Pytorch通信算子组合测试
  • 1-1 电场基本概念
  • Python 正则表达式完全指南
  • flutter web 路由问题
  • Springboot + vue3 实现大文件上传方案:秒传、断点续传、分片上传、前端异步上传
  • 医药垃圾分类管理系统|Java|SSM|JSP|
  • Intent--组件通信
  • 华为认证考试模拟题测试题库(含答案解析)
  • STM32-笔记10-手写延时函数(SysTick)
  • nacos-服务发现注册
  • 【Linux】shell脚本:查找可执行文件和批量创建多个账户
  • LabVIEW实现NB-IoT通信
  • Pillow库
  • arXiv-2024 | STMR:语义拓扑度量表示引导的大模型推理无人机视觉语言导航
  • Vuex 的使用和原理详解
  • android 手工签名,(电子签名)
  • windows C#-编写复制构造函数
  • 掌握Go语言:配置环境变量、深入理解GOPATH和GOROOT(1)
  • Java中String类型的字符串转换成JSON对象和JSON字符串
  • [STM32] 串口通信 (十一)
  • 【落羽的落羽 C语言篇】数据存储简介
  • 车载网关性能 --- 缓存buffer划分要求
  • 109.【C语言】数据结构之求二叉树的高度
  • 探究人工智能在教育领域的应用——以大语言模型为例