Elasticsearch 解析:倒排索引机制/字段类型/语法/常见问题
Elasticsearch 是一个分布式的开源搜索引擎,广泛用于全文搜索、分析和数据存储。它基于 Apache Lucene 构建,支持 RESTful 风格的 API,使得开发者能够高效地存储和检索数据。本文将详细讲解 Elasticsearch 的基本原理,特别是其倒排索引机制,常见语法的使用,以及在实际应用中可能遇到的常见问题及解决方案。
1. 倒排索引机制
Elasticsearch 是一个用于全文搜索、分析和存储数据的强大工具。它能够处理海量数据,并快速响应复杂的查询请求。Elasticsearch 的核心功能包括:
- 实时搜索:支持近实时的数据索引和搜索。
- 分布式特性:可以轻松扩展到多个节点。
- RESTful API:使用 HTTP 协议进行数据交互。
- 多种查询方式:支持各种复杂的查询语法。
1.1 什么是倒排索引?
倒排索引(Inverted Index)是 Elasticsearch 高效搜索的核心原理。它将文档中的每个词(term)与包含该词的文档列表建立映射关系。与传统的顺序索引不同,倒排索引能够更快地找到包含特定词的文档。
倒排索引的结构
倒排索引主要由两个部分组成:
- 词典(Dictionary):存储文档中所有唯一的词(term)。
- 倒排列表(Posting List):每个词对应一个列表,包含所有包含该词的文档 ID,以及其他相关信息,如词频(TF)和文档频率(DF)。
1.2 倒排索引的工作流程
- 文档分析:将文档中的文本分解为词项(tokens),并进行标准化处理(如小写化、去除停用词)。
- 构建索引:为每个词项在词典中创建条目,并将对应的文档 ID 添加到倒排列表中。
- 搜索请求:当接收到搜索请求时,Elasticsearch 将查询的词项映射到倒排索引,快速找到相关文档。
1.3 倒排索引的优势
- 高效搜索:能够快速找到包含特定词的文档,提高搜索速度。
- 支持复杂查询:允许使用布尔查询、短语查询等多种复杂的查询方式。
2.1 基本类型
2.1.1 字符串类型(Text 和 Keyword)
-
Text:
- 用于分析的文本字段,适合全文搜索。
- 存储时会被分词(tokenization),便于查找。
- 适用于长文本,如文章、描述等。
示例:
"description": {"type": "text" }
-
Keyword:
- 不进行分析的字符串字段,适合精确匹配。
- 通常用于 ID、标签、类别等需要精确查询的字段。
示例:
"category": {"type": "keyword" }
2.1.2 数字类型(Integer, Float, Double, etc.)
-
Integer:
- 整数类型,适用于整数字段。
示例:
"age": {"type": "integer" }
-
Float、Double:
- 浮点数类型,适合存储小数。
示例:
"price": {"type": "float" }
2.1.3 布尔类型(Boolean)
-
Boolean:
- 只存储
true
或false
值。
示例:
"is_active": {"type": "boolean" }
- 只存储
2.2 日期类型
-
Date:
- 用于存储日期和时间,支持多种日期格式。
示例:
"created_at": {"type": "date","format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ" }
2.3 对象和嵌套类型
2.3.1 对象类型(Object)
-
Object:
- 用于存储 JSON 对象,字段可以嵌套。
- 适合存储复杂的数据结构。
示例:
"address": {"type": "object","properties": {"city": { "type": "keyword" },"zip": { "type": "integer" }} }
2.3.2 嵌套类型(Nested)
-
Nested:
- 专门用于处理数组中的对象,确保在查询时保持对象之间的关系。
- 避免在传统对象类型中因扁平化导致的数据混乱。
示例:
"comments": {"type": "nested","properties": {"user": { "type": "keyword" },"message": { "type": "text" }} }
2.4 地理位置类型
-
Geo-point:
- 用于存储地理坐标(经纬度),支持地理查询。
示例:
"location": {"type": "geo_point" }
-
Geo-shape:
- 用于存储复杂的地理形状,如多边形和线条。
示例:
"area": {"type": "geo_shape" }
2.5 自定义字段类型
Elasticsearch 允许开发者定义自定义字段类型,以满足特定需求。这些自定义类型可以基于已有类型进行扩展,或通过插件实现。
2.6 字段类型选择的考虑因素
在选择字段类型时,需要考虑以下几个因素:
- 数据特性:字段的数据类型和内容。
- 查询需求:是否需要全文搜索、精确匹配或聚合。
- 性能影响:不同类型对存储和查询性能的影响。
2.7 字段类型的映射示例
以下是一个完整的映射示例,展示了多种字段类型的结合使用:
PUT /my_index
{"mappings": {"properties": {"title": {"type": "text"},"author": {"type": "keyword"},"published_date": {"type": "date"},"price": {"type": "float"},"tags": {"type": "keyword"},"comments": {"type": "nested","properties": {"user": { "type": "keyword" },"message": { "type": "text" }}},"location": {"type": "geo_point"}}}
}
3. 常见语法介绍
Elasticsearch 提供了丰富的查询语法,以下是一些常见的查询类型及其示例。
3.1 基本查询
3.1.1 匹配查询(Match Query)
匹配查询是最基本的查询类型,用于查找包含特定词的文档。
GET /index_name/_search
{"query": {"match": {"field_name": "search_term"}}
}
3.1.2 精确匹配查询(Term Query)
精确匹配查询用于查找字段中完全匹配的文档。
GET /index_name/_search
{"query": {"term": {"field_name": "exact_term"}}
}
3.2 复合查询
3.2.1 布尔查询(Bool Query)
布尔查询允许组合多个查询条件。
GET /index_name/_search
{"query": {"bool": {"must": [{ "match": { "field1": "value1" }},{ "match": { "field2": "value2" }}],"filter": {"term": { "field3": "value3" }}}}
}
3.2.2 范围查询(Range Query)
范围查询用于查找在某个范围内的文档。
GET /index_name/_search
{"query": {"range": {"field_name": {"gte": 10,"lte": 20}}}
}
3.3 聚合查询
聚合查询用于对数据进行分析和统计。
GET /index_name/_search
{"size": 0,"aggs": {"group_by_field": {"terms": {"field": "field_name"}}}
}
4. 常见问题及解决方案
在使用 Elasticsearch 的过程中,可能会遇到一些常见问题。以下是一些常见问题及其解决方案。
4.1 问题:索引未找到(Index Not Found)
- 描述:尝试查询一个不存在的索引。
- 解决方案:检查索引名称是否正确,确保索引已创建。可以使用
GET /_cat/indices
查看当前存在的索引。
4.2 问题:查询性能低下
-
描述:某些查询响应时间过长。
-
解决方案:
- 确保使用了合适的查询类型,避免使用
match_all
查询。 - 对常用字段建立索引,优化字段映射。
- 监控集群状态,确保集群健康。
- 确保使用了合适的查询类型,避免使用
4.3 问题:文档丢失或未更新
-
描述:更新文档后,查询仍返回旧数据。
-
解决方案:
- 确认文档已成功更新,可以使用
GET /index_name/_search
查询确认。 - 检查是否有未提交的变更,确保刷新索引。
- 确认文档已成功更新,可以使用
4.4 问题:内存不足
-
描述:集群运行过程中出现内存不足的情况。
-
解决方案:
- 调整 JVM 堆内存设置,确保合适的内存配置。
- 监控和优化索引的数量和大小,避免不必要的索引碎片。
5. 实际案例
以下是一个使用 Elasticsearch 进行日志搜索的实际案例。
5.1 需求背景
在一个电商平台中,用户需要快速搜索和分析日志数据,以便进行故障排查和性能优化。使用 Elasticsearch 能够高效地处理大量日志数据,并提供实时查询能力。
5.2 数据建模
定义日志数据的索引结构,包括时间戳、用户 ID、操作类型等字段。
PUT /logs
{"mappings": {"properties": {"timestamp": { "type": "date" },"user_id": { "type": "keyword" },"action": { "type": "text" },"details": { "type": "text" }}}
}
5.3 数据插入
使用 Bulk API 批量插入日志数据。
POST /logs/_bulk
{ "index": { "_id": "1" } }
{ "timestamp": "2024-01-01T10:00:00", "user_id": "user1", "action": "login", "details": "User logged in" }
{ "index": { "_id": "2" } }
{ "timestamp": "2024-01-01T10:05:00", "user_id": "user2", "action": "purchase", "details": "User purchased item A" }
5.4 查询示例
用户想要查询在某个时间段内的所有登录操作。
GET /logs/_search
{"query": {"bool": {"must": [{ "match": { "action": "login" }},{ "range": { "timestamp": { "gte": "2024-01-01T00:00:00", "lte": "2024-01-01T23:59:59" }}}]}}
}
相关文章:

Elasticsearch 解析:倒排索引机制/字段类型/语法/常见问题
Elasticsearch 是一个分布式的开源搜索引擎,广泛用于全文搜索、分析和数据存储。它基于 Apache Lucene 构建,支持 RESTful 风格的 API,使得开发者能够高效地存储和检索数据。本文将详细讲解 Elasticsearch 的基本原理,特别是其倒排…...

数字后端零基础入门系列 | Innovus零基础LAB学习Day5
###Module 12 RC参数提取和时序分析 数字后端零基础入门系列 | Innovus零基础LAB学习Day4 数字后端零基础入门系列 | Innovus零基础LAB学习Day3 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字后端零基础入门系列 | Innovus零基础LAB学习Day1 ###LAB12-1 这个章节…...
Redis 内存回收策略小结
Redis 内存回收策略 及时回收内存中不需要的数据,能有效地保持性能和防止内存溢出。Redis内存回收主要有两种场景 删除过期的键值对内存使用达到maxmemory时触发回收策略 删除过期的键值对 惰性删除: 在查询时如果发现 该键值对已经过期则执行删除操作…...
React常用前端框架合集
React 是 Facebook 开发的一款用于构建用户界面的 JavaScript 库。由于其高效、灵活的特性,React 成为了目前最流行的前端框架之一。为了帮助开发者更好地利用 React 构建应用,市场上涌现了许多优秀的辅助工具和框架。本文将详细介绍几个常用的 React 前…...

python对文件的读写操作
任务:读取文件夹下的批量txt数据,并将其写入到对应的word文档中。 txt文件中包含:编号、报告内容和表格数据。写入到word当中:编号、报告内容、表格数据、人格雷达图以及对应的详细说明(详细说明是根据表格中的标识那一列中的加号…...
Redis工具类(解决缓存穿透、缓存击穿)
文章目录 前言IBloomFilterObjectMapUtilsCacheClient使用示例具体业务的布隆过滤器控制层服务层 前言 该工具类包含以下功能: 1.将任意对象存储在 hash 类型的 key 中,并可以设置 TTL 2.将任意对象存储在 hash 类型的 key 中,并且可以设置…...

Air780E量产binpkg文件的获取方法
Air780E量产binpkg文件如何获取呢?操作方法如下。 一、背景 最近luatos开发客户增多,客户在量产烧录的时候需要binpkg文件,但是有些客户不知道binpkg文件是什么,在哪里获取,是否可以用soc文件提取出来,使…...

C++STL之stack
1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …...

git的学习之远程进行操作
1.代码托管GitHub:充当中央服务器仓库的角色 2.git远程进行操作 3.配置本地服务器的公钥 4.推送 5.git远程操作 pull .gitignore 6.给命令配置别名 git config --global alias.st status 7.标签管理 git tag -a [name] -m "XXX" [commit_id] 操作标签…...
蓝桥杯普及题
[蓝桥杯 2024 省 B] 好数 题目描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。 给定一个正整数 N N N,请计算从 1 1...
Spreadsheet导出excel
记录下常用的方法 数字转字符:Coordinate::stringFromColumnIndex(27); 输出 AA字符转数字:Coordinate::columnIndexFromString(AA); 输出27设置单元格式 eg:(设置为保留两位小数点) $sheet->getStyle($columnLetter)->getNumberFormat()->set…...
Leetcode|454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和
15.三数之和 哈希解法: 用俩个for循环求出,所需的a和b,再用哈希表,判断剩余的那个c是否在数组 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>…...
使用ceph-csi把ceph-fs做为k8s的storageclass使用
背景 ceph三节点集群除了做为对象存储使用,计划使用cephfs替代掉k8s里面现有的nfs-storageclass。 思路 整体实现参考ceph官方的ceph csi实现,这套环境是arm架构的,即ceph和k8s都是在arm上实现。实测下来也兼容。 ceph-fs有两种两种挂载方…...

太速科技-212-RCP-601 CPCI刀片计算机
RCP-601 CPCI刀片计算机 一、产品简介 RCP-601是一款基于Intel i7双核四线程的高性能CPCI刀片式计算机,同时,将CPCI产品的欧卡结构及其可靠性、可维护性、可管理性与计算机的抗振动、抗冲击、抗宽温环境急剧变化等恶劣环境特性进行融合。产品特别…...

【解决 Windows 下 SSH “Bad owner or permissions“ 错误及端口转发问题详解】
使用 Windows 连接远程服务器出现 Bad owner or permissions 错误及解决方案 在 Windows 系统上连接远程服务器时,使用 SSH 可能会遇到以下错误: Bad owner or permissions on C:\Users\username/.ssh/config这个问题通常是由于 SSH 配置文件 .ssh/con…...

使用预训练的BERT进行金融领域问答
获取更多完整项目代码数据集,点此加入免费社区群 : 首页-置顶必看 1. 项目简介 本项目旨在开发并优化一个基于预训练BERT模型的问答系统,专注于金融领域的应用。随着金融市场信息复杂性和规模的增加,传统的信息检索方法难以高效…...
ReactOS系统中MM_REGION结构体的声明
ReactOS系统中MM_REGION结构体的声明 ReactOS系统中MM_REGION结构体的声明 文章目录 ReactOS系统中MM_REGION结构体的声明MM_REGION MM_REGION typedef struct _MM_REGION {ULONG Type;//MEM_COMMIT,MEM_RESERVEULONG Protect;//PAGE_READONLYY,PAGE_READ_WRITEULONG Length;…...
web相关知识学习笔记
一, web安全属于网络信息安全的一个分支,www即全球广域网,也叫万维网,是一个分布式图形信息系统 二, 1.①安全领域,通常将用户端(浏览器端)称为前端,服务器端称为后端 ②…...

App测试环境部署
一.JDK安装 参考以下AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 二.SDK安装 安装地址:https://www.androiddevtools.cn/ 解压 环境变量配置 变量名:ANDROID_SDK_HOME 参考步骤: A…...

【论文阅读】Tabbed Out: Subverting the Android Custom Tab Security Model
论文链接:Tabbed Out: Subverting the Android Custom Tab Security Model | IEEE Conference Publication | IEEE Xplore 总览 “Tabbed Out: Subverting the Android Custom Tab Security Model” 由 Philipp Beer 等人撰写,发表于 2024 年 IEEE Symp…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...