Elastic Search 学习笔记

1. Elasticsearch 是什么?有哪些应用场景? Elasticsearch 整体原理流程?

Elasticsearch 是一个为海量数据提供近实时搜索和分析能力的分布式搜索引擎,广泛应用于全文检索、日志分析和大数据处理场景中。

Elasticsearch 整体原理流程:

1.建索引(Index)与定义 Mapping:建索引,相当于创建一个逻辑的数据容器,用于存放文档。Mapping,定义索引中字段的数据类型、分词器、是否索引等属性,类似数据库的 schema。通过 mapping,ES 知道如何解析和存储每个字段的数据,如何分词建立倒排索引。

2. 插入文档(Document):用户提交 JSON 格式的文档,写入到指定的索引中。ES 根据 mapping 解析字段,对需要分词的字段进行分词处理(Tokenizer + Token Filters),生成词项(tokens)。对每个词项建立倒排索引,记录词项在哪些文档中出现,以及出现频率、位置等信息。文档数据会被存储在主分片(Primary Shard)及其副本分片(Replica Shard)中,保证数据高可用。写操作异步刷新到磁盘,提高写入性能。

3. 查询流程:查询请求发到集群的某个节点(协调节点)。协调节点根据索引的分片信息,将查询请求广播到所有相关的主分片和副本分片。对查询语句进行解析,针对查询字段使用对应的分词器分词(如 match 查询)。在倒排索引中查找词项,快速定位匹配文档 ID。计算文档相关度得分(基于 TF-IDF 或 BM25 算法等),排序。各分片返回结果给协调节点。协调节点合并各分片结果,进行排序分页,返回最终结果给客户端。

2. 倒排索引是什么?为什么适合全文检索?

在理解倒排索引之前,先看一下正排索引。正排索引是从“文档到词”的映射,也就是说:每个文档记录了它包含的所有词。而倒排索引则是相反的:它是从“词到文档”的映射,即:每个词会记录它出现在哪些文档中。

当我们搜索一个词时,只需通过倒排索引快速定位所有包含该词的文档,而不需要对所有文档内容进行全文扫描,大大提升了搜索性能。此外,倒排索引还可以记录每个词在各个文档中出现的频率、位置等信息,用于相关性打分(如 BM25 算法),从而实现搜索结果的排序和精准匹配。因此,倒排索引非常适合实现高性能的全文搜索,是搜索引擎(如 Elasticsearch)核心的数据结构之一。

3. ES 中的文档(Document)、索引(Index)、类型(Type)是什么?

在 Elasticsearch 中,最基本的数据单位是 Document(文档),它就像数据库中的一行数据,JSON 格式存储。

文档是存在哪个 Index(索引) 里的,索引可以类比为数据库或表,是文档的逻辑集合。

早期 ES 中还支持 Type(类型),一个 Index 下可以有多个 Type,相当于一个数据库里有多个表。但因为底层结构冲突,从 6.x 开始被逐步废弃,7.x 开始每个索引只能有一个 Type,8.x 完全移除。

所以现在实际开发中,一个索引通常只存一种类型的文档,不再使用 Type。

比如我们项目中有商品搜索功能,就会创建一个 product_index,每条商品数据就是一个文档,包含商品名、描述、价格等字段,然后通过这个索引来实现搜索和过滤。

4. 什么是 Mapping?和数据库中的 schema 有什么区别?

在 Elasticsearch 中,索引(Index)通过 Mapping 来定义文档结构,包括字段名、字段类型、是否索引、是否分词等规则,相当于定义表的结构。

PUT /products
{"mappings": {"properties": {"name": { "type": "text", "analyzer": "standard" },"price": { "type": "float" },"in_stock": { "type": "boolean" },"created_at": { "type": "date" }}}
}

文档(Document)是索引中的一条具体数据记录,以 JSON 格式存储,结构要符合 Mapping 的定义。

POST /products/_doc/1
{"name": "Apple iPhone 14","price": 799.99,"in_stock": true,"created_at": "2024-06-01T10:00:00Z"
}

所以可以理解为:Mapping 决定了索引中能存什么样的数据结构,文档就是实际存进去的数据。

在 Elasticsearch 中,Mapping 类似于数据库中的 Schema,它定义了每个文档字段的数据类型、是否分词、是否索引、分词器、是否支持聚合等规则。
不同于数据库,ES 的 Mapping 更加灵活,比如可以支持嵌套结构、数组、动态字段,还能定义全文检索相关的分词方式,是搜索性能调优的重要部分。

5. ES 中 matchterm 查询的区别?

在 Elasticsearch 中,match 查询是 全文检索 类型的查询,它会对查询条件先进行分词,然后再去倒排索引中查找对应的文档,常用于搜索 text 类型字段,比如商品描述、文章内容等。

term 查询则是 精确匹配 查询,它不会进行分词,直接使用给定的值去匹配字段,常用于 keyword、数值、布尔值等字段的过滤或精确判断。

所以两者的核心区别就是:match 会分词,适合模糊查询;term 不分词,适合精确查询。

6. ES 是怎么进行分词的?常用的分词器有哪些?

Elasticsearch 使用 分词器(Analyzer) 来对文本字段进行处理,分词器会将一段文本拆分为一个个词项(term)并进行标准化,例如大小写转换、去除符号、删除停用词等。

分词器一般包含三个组件:

1.字符过滤器(Char Filters):预处理文本,如去除 HTML 标签。

2.分词器(Tokenizer):将文本切分成词(最核心部分)。

3.词项过滤器(Token Filters):对分词结果进行加工,比如大小写统一、去除停用词、同义词处理等。

常用分词器:

1.standard:默认分词器,按空格、标点分词,同时做大小写标准化

输入: I'm learning Elasticsearch.

输出:i, m, learning, elasticsearch

2.simple:以非字母字符为分隔符,只保留小写英文

输入: Hello, World!

输出: hello, world

3.whitespace:仅以空格分词,不做其他处理

输入: Hello, World!

输出: hello, world

4.keyword:不分词,把整个输入当成一个词项

输入: 中华人民共和国

输出: 中华人民共和国

5.ik_max_word:中文分词器,细粒度,尽可能多的切词

输入: 中国互联网公司

输出: 中国, 互联网, 公司, 中国互联网, 互联网公司

6.ik_smart:中文分词器,粗粒度,分得较少但准确

输入: 中国互联网公司

输出: 中国互联网, 公司

7. 什么是主分片(Primary Shard)和副本分片(Replica Shard)?

在 Elasticsearch 中,索引的数据是通过主分片和副本分片进行分布式存储的。

主分片(Primary Shard)负责实际写入和保存原始数据;副本分片(Replica Shard)是主分片的冗余副本,用于容灾备份和查询负载均衡。

通常每个主分片至少配置一个副本,从而保证当某个节点宕机时数据不会丢失,并且查询时可以由多个分片并行处理提升性能。

主分片负责写入,副本分片负责高可用和查询负载分担;主分片挂了,副本可以自动转为主分片,保障数据可靠性。

8. ES 是如何保证高可用的?节点挂掉会怎样?

Elasticsearch 通过主/副分片机制、Master 选举机制以及自动分片迁移能力实现高可用。

当某个节点宕机时,集群会自动将其主分片由副本接管,并在其他节点上重新构建副本,从而实现无缝切换,保证查询和写入的连续性。同时,Master 节点也有选举机制,避免单点故障,整个集群能自动感知变化并自我修复。

节点挂掉会发生什么?

Elasticsearch 会立刻识别失联节点(默认 30 秒内)。

该节点上的主分片如果有副本,副本会自动被提升为主分片。

副本不足的部分,会被自动重新分配到其他节点上重建副本。

查询和写入请求会自动路由到新的主分片或其副本,不会影响业务使用。

如果主节点宕机,会触发主节点重新选举机制,集群会暂时处于 yellow 状态,自动恢复后变回 green。

9. 怎么保证 ES 和数据库之间的数据一致性?

保证 ES 和数据库之间数据一致,关键在于解决异步同步导致的最终一致性问题:

1. 幂等写入

ES 写入接口要设计幂等,避免重复写入产生脏数据。

常用 document id 由业务唯一主键生成。

2. 异步消息可靠传递

使用消息队列保障消息不丢失(持久化、确认机制)。

设计消息重试机制,处理写 ES 失败。

3. 事务保证与补偿机制

有条件的场景使用分布式事务(如基于消息中间件的事务模式)。

定时全量校验比对,发现不一致后自动修复。

4. 顺序消费

保证消息顺序消费,避免旧数据覆盖新数据。

5. 监控和告警

监控同步延迟和失败率,及时人工干预。

10. 实际项目中一般数据是怎么同步到 ES 的?

1. 应用程序主动写入(同步写入)

在业务系统(如数据库)写操作后,直接调用 Elasticsearch API 进行索引写入。

2. 异步同步(消息队列/日志异步消费)

业务系统将数据变更事件发送到消息队列(Kafka、RabbitMQ 等)。专门的同步服务监听消息队列,异步写入 Elasticsearch。

3. 定时全量同步 + 增量同步

定时全量同步是指周期性(比如每天凌晨)将数据库中的所有数据一次性批量导入 Elasticsearch。目的是初始化数据或修复数据不一致问题。

增量同步是指只同步自上次同步后数据库中新增加或变更的数据。可以通过基于业务表的时间戳字段(如 update_time)进行差量查询;使用数据库变更日志(binlog)捕获变更事件;监听消息队列中实时数据变更事件来实现增量同步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/87151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划之斐波那契数(一)

解法一&#xff1a;递归 class Solution { public:int fib(int n) {if(n<2) return n;return fib(n-1)fib(n-2);} }; 解法二&#xff1a;dp class Solution { public:int fib(int N) {if (N < 1) return N;int dp[2];dp[0] 0;dp[1] 1;for (int i 2; i < N; i) {…

如何设置爬虫的访问频率?

设置爬虫的访问频率是爬虫开发中的一个重要环节&#xff0c;尤其是在爬取大型网站&#xff08;如1688&#xff09;时&#xff0c;合理的访问频率可以避免对目标网站造成过大负担&#xff0c;同时也能降低被封禁的风险。以下是一些常见的方法和建议&#xff0c;帮助你合理设置爬…

前端面试六之axios

一、axios简介 Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js 环境。在浏览器端&#xff0c;Axios 的底层实现是基于原生的 XMLHttpRequest&#xff08;XHR&#xff09;。它对 XHR 进行了封装&#xff0c;增加了 Promise 支持、自动转换 JSON 数据…

模板方法模式Template Method Pattern

模式定义 定义一个操作中算法的骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 类行为型模式 模式结构 AbstractClass&#xff1a;抽象类ConcreteClass&#xff1a;具体子类 只有类之间的继…

【行云流水AI笔记】游戏里面的强化学习使用场景

强化学习在游戏中的应用已从早期的棋类博弈扩展到现代复杂游戏的全流程优化&#xff0c;以下是结合最新技术进展的核心应用场景及典型案例&#xff1a; 一、竞技游戏的策略突破 1. 策略博弈类游戏 代表案例&#xff1a;AlphaGo/AlphaZero&#xff08;围棋&#xff09;、Alph…

使用Python和PyTorch框架,基于RetinaNet模型进行目标检测,包含数据准备、模型训练、评估指标计算和可视化

下面是一个完整的实现方案,使用Python和PyTorch框架,基于RetinaNet模型进行目标检测,包含数据准备、模型训练、评估指标计算和可视化。 import os import numpy as np import matplotlib.pyplot as plt import torch import torchvision from torchvision.models.detection…

springboot服务如何获取pod当前ip方案及示例

在 Kubernetes 集群中&#xff0c;Spring Boot 服务获取 Pod 当前 IP 的方案主要有两种&#xff1a;通过环境变量注入 或 通过 Java 代码动态获取网络接口 IP。以下是两种方案的详细说明及示例&#xff1a; 方案一&#xff1a;通过 Kubernetes Downward API 注入环境变量 原理…

1.MySQL三层结构

1.所谓安装的Mysql数据库&#xff0c;就是在电脑上安装了一个数据库管理系统&#xff08;【DBMS】database manage system&#xff09;&#xff0c;这个管理程序可以管理多个数据库。 2.一个数据库中可以创建多个表&#xff0c;以保存数据&#xff08;信息&#xff09;。【数据…

[深度学习]目标检测基础

目录 一、实验目的 二、实验环境 三、实验内容 3.1 LM_BoundBox 3.1.1 实验代码 3.1.2 实验结果 3.2 LM_Anchor 3.2.1 实验代码 3.2.2 实验结果 3.3 LM_Multiscale-object-detection 3.3.1 实验代码 3.3.2 实验结果 四、实验小结 一、实验目的 了解python语…

ALOHA机器人平台:低成本、高精度双臂操作及其进展深度解析

原创1从感知决策到具身智能的技术跃迁与挑战(基座模型与VLA模型)2ALOHA机器人平台&#xff1a;低成本、高精度双臂操作及其进展深度解析3(上)通用智能体与机器人Transformer&#xff1a;Gato和RT-1技术解析及与LLM Transformer的异同4(下)通用智能体与机器人Transformer&#x…

C++: 类 Class 的基础用法

&#x1f3f7;️ 标签&#xff1a;C、面向对象、类、构造函数、成员函数、封装、继承、多态 &#x1f4c5; 更新时间&#xff1a;2025年6月15日 &#x1f4ac; 欢迎在评论区留言交流你的理解与疑问&#xff01; 文章目录 前言一、什么是类&#xff1f;二、类的定义1.基本语法2.…

Java EE与Jakarta EE命名空间区别

在 Java 生态中&#xff0c;javax 和 jakarta 代表了 企业级 Java 规范&#xff08;Java EE/Jakarta EE&#xff09;的命名空间演进&#xff0c;核心区别在于归属权和管理组织的变更。以下是详细对比&#xff1a; 1. 历史背景 javax&#xff1a; 源自 Java EE&#xff08;Java …

2 Studying《Arm A715 Technical Reference Manual》

目录 2. The Cortex‑A715 core 2.1 Cortex‑A715 core features 2.2 Cortex‑A715 core confifiguration options 2.3 DSU-110 dependent features 2.4 Supported standards and specifications 2.6 Design tasks 3. Technical overview 3.1 Core components 3.2 Int…

使用Nodejs尝试小程序后端服务编写:简单的待办事项管理demo

文章目录 结构demo步骤demo运行效果API测试(1) 添加待办事项(2) 获取所有待办事项(3) 切换完成状态(4) 删除待办事项 API测试-RESTClient一些其他的高级功能环境变量管理不同环境配置授权认证 测试需要登录的接口保存响应测试脚本编写自动化测试 bug解决 结构 尝试写一个简单的…

CSS“多列布局”

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​col…

Pump上狙击机制的功能优势和实战教学

加密世界的发展永远伴随着速度的革命。无论是新的 Token 上线&#xff0c;还是热点项目的第一波流动性注入&#xff0c;抢先一步往往意味着利润的几何级增长。在这个讲究「秒杀」与「先机」的赛道中&#xff0c;一项关键策略正悄然成为链上操作者的常规武器——狙击&#xff08…

条件收敛的级数中项必须趋于 0,正负项抵消,但趋于 0 的速度不需要“足够快”

条件收敛的级数中&#xff0c;项必须趋于 0&#xff0c;但趋于 0 的速度不需要“足够快”的原因可以从以下几个方面理解&#xff1a; 1. 收敛的必要条件&#xff1a;项趋于 0 对于任何收敛的级数&#xff08;无论是绝对收敛还是条件收敛&#xff09;&#xff0c;都必须满足 li…

Tomcat 和 Spring MVC

Tomcat 和 Spring MVC 是 Java Web 开发中两大核心组件&#xff0c;分别承担不同的角色&#xff1a; 一、Tomcat 定义 Apache Tomcat 是一个开源的 Servlet 容器&#xff08;也称为 Servlet 引擎&#xff09;&#xff0b; JSP 引擎&#xff0c;实现了 Java EE&#xff08;现称 …

【微服务】134:SpringCloud

今天是刘小爱自学Java的第134天。 感谢你的观看&#xff0c;谢谢你。 image 学习内容安排如下&#xff1a; SpringCloud的接触。利用SpringCloud搭建微服务架构&#xff0c;当然这个估计要3天时间才能完成&#xff0c;今天主要是注册中心Eureka的学习。 一、SpringCloud 微服务…

三次贝塞尔曲线,二次贝塞尔曲线有什么区别

三次贝塞尔曲线和二次贝塞尔曲线在控制点数量、数学表达式和曲线复杂度上有所不同。以下是它们的主要区别&#xff1a; 1. 控制点数量 二次贝塞尔曲线&#xff1a;由3 个点定义&#xff08;起点、终点和 1 个控制点&#xff09;。三次贝塞尔曲线&#xff1a;由4 个点定义&…