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…...
2025 - AI人工智能药物设计 - 中药网络药理学和毒理学的研究
中药网络药理学和毒理学的研究 TCMSP:https://old.tcmsp-e.com/tcmsp.php 然后去pubchem选择:输入Molecule Name 然后进行匹配:得到了smiles 再次通过smiles:COC1C(CC(C2C1OC(CC2O)C3CCCCC3)O)O 然后再次输入:http…...
iwebsec靶场 XSS漏洞通关笔记
目录 前言 1.反射性XSS 2.存储型XSS 3.DOM型XSS 第01关 反射型XSS漏洞 1.打开靶场 2.源码分析 3.渗透 第02关 存储型XSS漏洞 1.打开靶场 2.源码分析 4.渗透 方法1: 方法2 方法3 第03关 DOM XSS漏洞 1.打开靶场 2.源码分析 3.渗透分析 3.渗透过程…...
设计模式-单例模型(单件模式、Singleton)
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 单例模式同时解决了两个问题, 所以违反了单一职责原则: 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例…...
笔记本双系统win10+Ubuntu 20.04 无法调节亮度亲测解决
sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt-get update sudo apt-get install brightness-controller-simple 安装好后找到一个太阳的图标,就是这个软件,打开后调整brightness,就可以调整亮度,可…...
零基础Java第十一期:类和对象(二)
目录 一、对象的构造及初始化 1.1. 就地初始化 1.2. 默认初始化 1.3. 构造方法 二、封装 2.1. 封装的概念 2.2. 访问限定符 2.3. 封装扩展之包 三、static成员 3.1. 再谈学生类 3.2. static修饰成员变量 一、对象的构造及初始化 1.1. 就地初始化 在声明成员变…...
NumPy包(下) python笔记扩展
9.迭代数组 nditer 是 NumPy 中的一个强大的迭代器对象,用于高效地遍历多维数组。nditer 提供了多种选项和控制参数,使得数组的迭代更加灵活和高效。 控制参数 nditer 提供了多种控制参数,用于控制迭代的行为。 1.order 参数 order 参数…...
极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【一】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
Oracle 第1章:Oracle数据库概述
在讨论Oracle数据库的入门与管理时,我们可以从以下几个方面来展开第一章的内容:“Oracle数据库概述”,包括数据库的历史与发展,Oracle数据库的特点与优势。 数据库的历史与发展 数据库技术的发展可以追溯到上世纪50年代…...
7、Nodes.js包管理工具
四、包管理工具 4.1 npm(Node Package Manager) Node.js官方内置的包管理工具。 命令行下打以下命令: npm -v如果返回版本号,则说明npm可以正常使用 4.1.1npm初始化 #在包所在目录下执行以下命令 npm init #正常初始化,手动…...
网络地址转换——NAT技术详解
网络地址转换——NAT技术详解 一、引言 随着互联网的飞速发展,IP地址资源日益紧张。为了解决IP地址资源短缺的问题,NAT(Network Address Translation,网络地址转换)技术应运而生。NAT技术允许一个私有IP地址的网络通…...
oracle数据库网站开发/今天的新闻是什么
之前tensorflow的检测环境一直没有用gpu版的 后来在python3.6cuda8.0cudnn6下装tensorflow1.2/1.3/1.4都有问题报错 ①:1.2、1.3的gpu版在import tensorflow时就直接报错 ②:1.4的TensorFlow-gpu可以import,但是在运行faster的时候就有问…...
网络维护好学吗/网站页面优化方案
GotW #04 Class Mechanics 著者:Herb Sutter 翻译:kingofark [声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供…...
旅游景区网站建设/百度关键词推广可以自己做吗
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。 1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<key[2i1]&&Key[i]<key[2i2]或者Key[i]>Key[2i1]&&key>key[2i2] 即任何一非叶节点的…...
张家港网站制作公司/上海aso优化公司
如果采用与十进制减法相同的方法,那么从一个较大的二进制数中减去一个较小的无符号二进制数就很容易了。示例如下:01101 (十进制数 13)– 00111 (十进制数 7)———-位 0 上的减法非常简单:01101– 00111———-0下一个位置上执行…...
一般上什么网站/中国十大关键词
1、原因:引入了新包,然后不想用了,又删掉了,提交的时候依然提示删掉的包要进行上传; 2、commit 后提示E155010错误; 3、所以重新提交的时候,只需要在文件上面点击右键,点击Revert&…...
在网站建设中 为了防止工期拖延/交换链接营销案例
看上去修改后的connect()方法已经可用了,但是这种匿名线程的方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用 程序的效率要低很多;第二,线程无法管理,…...