文章目录

  • Elasticsearch简介
  • ES概念
    • ES和关系型数据库的对比
    • 正序索引和倒序索引
    • 安装es、kibana、IK分词器
  • ES操作
    • _cat操作
    • Mapping映射属性
    • 索引库操作
      • 索引库CRUD
      • 文档CRUD
      • 文档批处理操作
  • Java客户端操作ES

Elasticsearch简介

就是一个搜索引擎数据库
在这里插入图片描述以下都简称ES

ES概念

ES和关系型数据库的对比

ES是面向文档的!文档数据都会序列化为JSON格式存储,所以一切都是Json ,ES(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表)(类型es8后被弃用,一个索引下存储单一类型数据),每个类型/索引下又包含多个文档(行),每个文档中又包含多个字段(列)
在这里插入图片描述
SQL是操作SQL数据库的语法,DSL是操作ES数据库的语法

概念/功能Elasticsearch (ES)MySQL核心差异说明
数据组织层级
索引Index(最高层级逻辑数据容器)DatabaseES的Index类似于MySQL的Database,都是顶层数据容器
类型Type(已废弃)TableES的类型概念已淘汰,现在每个索引存储单一类型数据
文档Document(JSON格式基本数据单元)Row文档是半结构化JSON,行是结构化记录
字段Field(JSON键值对)ColumnES字段动态灵活,MySQL列需预定义
数据定义
结构定义Mapping(定义字段类型和属性)SchemaES映射支持动态添加字段,MySQL需预定义结构
唯一标识_id(文档唯一标识)Primary Key功能相似,都是数据唯一标识符
数据操作
查询语言Query DSL(JSON格式)
SQL Over ES(有限支持)
SQLES主要使用专用JSON查询,MySQL使用标准SQL
写入/更新Index API(写入)
Update API(部分更新)
INSERT/UPDATE/DELETEES写入称为"索引",支持脚本更新
系统特性
事务支持❌ 不支持ACID事务✅ 支持ACID事务MySQL适合银行交易等场景,ES不适合
数据一致性⏱️ 最终一致性(近实时NRT)✅ 强一致性ES写入后约1秒可查,MySQL立即可见
存储引擎Apache Lucene(倒排索引+Doc Values)InnoDB(B+树索引)Lucene优化全文搜索,InnoDB优化事务处理
索引机制🔄 自动索引所有字段
倒排索引(文本)
Doc Values(聚合)
⚙️ 需显式创建索引
B+树索引(主键/普通)
FULLTEXT(全文)
ES默认索引所有字段,MySQL需手动创建
扩展性⚡ 原生分布式
自动分片(Shard)
副本(Replica)
🧩 需分库分表
主从复制
ES天生分布式易扩展,MySQL水平扩展复杂
主要用途🔍 全文搜索
📊 日志/指标分析
🌐 地理空间分析
💳 事务处理(OLTP)
🧾 关系数据管理
📈 报表查询(OLAP)
ES擅长搜索分析非结构化数据,MySQL擅长事务管理结构化数据
最佳实践
适用场景搜索引擎、日志分析、实时监控电商交易、用户管理、财务系统常组合使用:MySQL作主数据源,ES提供搜索分析
数据模型无模式(Schema-less)
JSON文档
严格模式(Schema-on-Write)
行列结构
ES灵活适合变化数据,MySQL严谨保证数据完整性
两者的不同
在这里插入图片描述

正序索引和倒序索引

正序索引就是关系型数据库用的,但是这种使用%小米%这种模糊搜索的时候会导致正向索引失效,然后一个一个去比对,会非常浪费时间(当数据量非常大的时候)
在这里插入图片描述
倒序索引就是你在插入文档的时候,将拿到词分成几个词条(比如小米手机会分成小米和手机),并且记录相应的文档id,之后分词还有相同的会记录到一个词条中
在这里插入图片描述
然后我们搜索的时候,比如搜索华为手机
在这里插入图片描述

安装es、kibana、IK分词器

es是数据库,kibana可以理解为navicat是看es中数据的
这里不做讲解哈
可以看一下其他的文章

ES操作

对于ES的所有操作ES都封装成立restfulapi用http请求调用
和我们的mysql需要用connection一样

_cat操作

直接
http://es所在IP:es启动端口号/_cat/master
在这里插入图片描述

Mapping映射属性


其实还有一个type类型为:nested 可以防止检索错误
每一个字段都有上面对应的属性
比如下面这个

{
"age": 21,
"weight": 52.1,
"isMarried":false,
"info":"黑马程序员Java讲师",
"email":"zy@itcast.cn",
"score":[99.199.598.9],
"name":
{"firstName":"云",
"lastName":"赵"}
}

age字段type对应数值呗,byte就够用,index有无看需求(是否参与搜索或者排序),21肯定是不需要分词器的,无子字段所以肯定没有properties
info字段对应text,因为可以分词,index肯定是要的,分词器需要自己指定,无子字段
name是有子字段的(嵌套object对象),所有有properties,里面每一个值又单独有自己的mapping
firstname肯定还是keyword不需要分词
这个score的type是floates中,所有数组类型我们都不用管,只需要看里面元素的类型

索引库操作

ES都是基于Restful的接口,先介绍一下Restful
在这里插入图片描述

索引库CRUD

下面对应索引库的文档的CRUD操作我都将在kibana的开发工具中发送http请求(有提示),且不用带上我们的es ip+端口,因为kibana是和es本身就绑定的
如图
在这里插入图片描述
创建索引命令
里面设置对应的mapping
新增索引库 注:这里新增是PUT请求

PUT /heima
{"mappings": {"properties": {"info":{"type": "text","analyzer": "standard","index": true},"age":{"type": "byte","index": true},"email":{"type": "keyword","index": false},"name":{"type": "object", "properties": {"firstName":{"type": "keyword"},"lastName":{"type": "keyword"}}}}}
}

查询索引库

GET /xiaoyuan
xiaoyuan为索引库名

删除索引库

DELETE /xiaoyaun
xiaoyuan为索引库名

ES索引库不支持修改,不可以对已有数据段修改,但是可以添加新字段
如图
在这里插入图片描述

文档CRUD

新增文档

POST /索引库/_doc/文档ID(不写自动生成)
{json数据-应对应索引库结构}
添加文档(指定ID1为指定的ID
POST /products/_doc/1
{"name": "Wireless Headphones","price": 129.99,"description": "Noise-cancelling Bluetooth headphones","stock": 50,"created_at": "2023-10-25T08:30:00Z"
}添加文档(自动生成IDPOST /products/_doc
{"name": "Smart Watch","price": 299.99,"description": "Water-resistant fitness tracker","stock": 25,"created_at": "2023-10-26T10:15:00Z"
}响应示例(自动ID{"_index": "products","_id": "abc123xyz",(返回的文档id)"_version": 1,"result": "created"
}

读取文档

GET /products/_doc/文档ID
获取单个文档
GET /products/_doc/1响应示例
{"_index": "products","_id": "1","_version": 1,"_source": {"name": "Wireless Headphones","price": 129.99,"description": "Noise-cancelling Bluetooth headphones","stock": 50,"created_at": "2023-10-25T08:30:00Z"}
}
搜索文档
GET /products/_search
{"query": {"match": {"description": "bluetooth"}}
}

删除文档

DELETE /索引库名/_doc/文档ID
# 删除单个文档
DELETE /products/_doc/1# 响应示例
{"_index": "products","_id": "1","_version": 2,"result": "deleted"
}# 按查询删除(删除所有库存为0的商品)
POST /products/_delete_by_query
{"query": {"term": {"stock": 0}}
}

更新文档(分两种)
1.全量修改
2.增量修改

全量修改
相当于是先删除原文档再添加新文档
语法

PUT /索引库名/_doc/文档ID
{ 数据 }

实例

替换整个文档(覆盖操作)
PUT /products/_doc/1
{"name": "Premium Headphones","price": 149.99,"description": "Deluxe noise-cancelling model","stock": 40,"created_at": "2023-10-25T08:30:00Z"
}

增量修改
语法

POST /索引库名/_update/文档id
{
"doc" {"字段名""新的值",...}
}

实例

部分更新(增加库存)
POST /products/_update/1
{"doc": {"stock": 60}
}

文档批处理操作

一次请求包含多个文档操作
在这里插入图片描述
解释如下

POST /_bulk 作为请求路径
"index"索引,动词索引就是插入数据呗(或者全量改动)
索引一个文档,后面接着一条数据,需要指定_index-索引库和_Id文档id(不写默认生成)
"index""create"相似,但是"create"是只可以创建,不能覆盖
而"index"既可以创建新的,也可以覆盖原来的文档
"update"是增量改动,跟着一行"doc"携带修改字段
"delete"删除指定索引库和文档ID即可

案例

POST /_bulk
{ "index" : { "_index" : "products", "_id" : "101" } }
{ "name": "USB-C Cable", "price": 15.99, "stock": 200 }
{ "create" : { "_index" : "products", "_id" : "102" } }
{ "name": "Phone Charger", "price": 29.99, "stock": 150 }
{ "update" : {"_id" : "101", "_index" : "products"} }
{ "doc" : {"stock": 180} }
{ "delete" : { "_index" : "products", "_id" : "100" } }

Java客户端操作ES

对应的可以操作ES的API有很多种(其实可以发http请求的的可以操作不过要自己封装很麻烦)
我们用Elasticsearch-Rest-Client这个官方提供的
比如我们操作redis就用Spring Data Redis这个依赖一样的(或者redisson)
这里的话暂时不做讲解,因为gulimall对应的操作api好像已经过期了,es8后又需要其他api了

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

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

相关文章

【论文撰写】如何把AI生成的文本公式复制在word中,完整的复制公式,拷贝豆包生成的公式

1、问题描述 AI生成的内容 在对于含有公式的生成内容,直接拷贝到Word 会呈现类Markdown的格式,除了格式上,公式也不是标准格式。 如下列两个图片对比 2、工具 这时,就需要用另一个工具进行转换 Home - Snip Web Mathpix Acc…

【机器学习笔记 Ⅱ】5 矩阵乘法

矩阵乘法是神经网络、图形学、科学计算等领域的核心运算,用于高效处理线性变换和批量数据计算。以下是其数学定义、计算规则及实际应用的系统解析。1. 数学定义2. 计算步骤(示例)3. 代码实现 (1) Python(NumPy) import…

【数字后端】- 衡量design的congestion情况

基础概念 通常在RP的placement之后,就要去去查看设计的Density和Congestion情况。 而congestion的衡量指标有以下两点: (1)Overflow Congestion 分析基于一个基本『单元』称为GCELL: Routing Grid cell. Gcell 是工具自己定义…

Oracle面试题-体系结构

📌1.如何查看 Oracle 数据库的版本信息? 1. 标准 SQL 查询(推荐) 方法 1:查询 v$version 视图(最常用) SELECT * FROM v$version;输出示例: BANNER -------------------------------…

Flex布局原理

1.布局原理 flex 是 flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以 指定为 flex 布局。 当我们为父盒子设为 flex 布局以后,子元素的 float、clear 和 vertical-align 属性将…

JavaScript 模块系统二十年:混乱、分裂与出路

JavaScript 模块系统:一场至今未醒的历史梦魇 一、引言:我们真的解决了“模块化”吗? 你可能以为,JavaScript 模块系统早已标准化,import/export 就是答案。 但现实却是另一番景象:构建报错、依赖冲突、加…

人工智能-基础篇-23-智能体Agent到底是什么?怎么理解?(智能体=看+想+做)

1、智能体是什么? 想象你有一个超级聪明的小助手,它能: 自己看环境(比如看到天气、听到声音、读到数据);自己做决定(比如下雨了要关窗,电量低要去充电);自己…

Java实现项目1——弹射球游戏

项目:弹射球游戏 项目描述: 类似于乒乓球的游戏,游戏可以播放背景音乐,可以更换背景图,当小球碰到下面的挡板后会反弹,当小球碰到方块后会增加分数,当小球掉落会导致游戏失败,按下…

(十八)深入了解 AVFoundation-编辑:添加背景音乐与音量控制(下)——实战篇

一、功能目标回顾在理论篇中,我们系统地介绍了如何使用 AVFoundation 添加背景音乐音轨,并通过 AVMutableAudioMix 与 AVMutableAudioMixInputParameters 实现多音轨混音与音量控制。我们了解了诸如淡入淡出、静音控制、动态音量曲线等核心技术细节。本篇…

如何在新机器上设置github完成内容git push

如果你在一台新的机器上git pull 仓库,完成修改,然后git push,会发现下面错误: Username for https://github.com: xiaomaolv Password for https://xiaomaolvgithub.com: remote: Support for password authentication was rem…

Rust 注释

Rust 注释 引言 Rust 编程语言以其内存安全、并发支持和高性能等特点在软件开发领域获得了广泛的关注。在Rust编程中,注释是一种非常重要的元素,它不仅可以帮助程序员理解代码,还可以提高代码的可维护性和可读性。本文将详细介绍Rust中的注释…

Flink Oracle CDC 环境配置与验证

一、Oracle 数据库核心配置详解 1. 启用归档日志(Archiving Log) Oracle CDC 依赖归档日志获取增量变更数据,需按以下步骤启用: 非CDB数据库配置: -- 以DBA身份连接数据库 CONNECT sys/password AS SYSDBA; -- …

ssh: Could not resolve hostname d: Temporary failure in name resolution

关于不能本机上传文件夹到服务器上的一个问题的记录。 scp -r "D:\***\datasets" usernamexxxxxx:接收文件夹名 一直报错:ssh: Could not resolve hostname d: Temporary failure in name resolution 反复尝试发现无果之后想起来,在传输的时候…

2025年的前后端一体化CMS框架优选方案

以下是结合技术生态、开发效率和商业落地验证,整理的2025年前后端一体化CMS框架优选方案:一、‌主流成熟框架组合‌1. ‌React Node.js (Express/Next.js)‌‌前端‌:React生态成熟,配合Redux状态管理,适合复杂后台界…

《声音的变形记:Web Audio API的实时特效法则》

用户期待更丰富、更具沉浸感的听觉体验时,基于Web Audio API实现的实时音频特效,就像是为这片森林注入了灵动的精灵,让简单的声音蜕变为震撼人心的听觉盛宴。回声特效带来空间的深邃回响,变声效果赋予声音全新的个性面貌。接下来&…

LLM场景下的强化学习【PPO】

适合本身对强化学习有基本了解 一、什么是强化学习 一句话:在当前状态(State)下,智能体(Agent)与环境(Environment)交互,并采取动作(Action)进入下一状态,过程中获得奖励(Reward,有正向有负向),从而实现从…

Python爬虫实战:研究chardet库相关技术

1. 引言 1.1 研究背景与意义 在互联网信息爆炸的时代,网络数据采集技术已成为信息获取、数据分析和知识发现的重要手段。Python 作为一种高效的编程语言,凭借其丰富的第三方库和简洁的语法,成为爬虫开发的首选语言之一。然而,在网络数据采集中,文本编码的多样性和不确定…

回溯题解——全排列【LeetCode】

46. 全排列 一、算法逻辑(逐步通顺讲解每一步思路) 该算法使用了典型的 回溯(backtracking) 状态数组 思路,逐层递归生成排列。 题目目标:给定一个无重复整数数组 nums,返回其所有可能的全排…

RICE模型或KANO模型在具体UI评审时的运用经验

模型是抽象的产物,结合场景才好说明(数据为非精确实际数据,仅供参考,勿照搬)。 ​​案例一:RICE模型解决「支付流程优化」vs「首页动效升级」优先级争议​​ ​​背景​​:APP电商模块在迭代中面临两个需求冲突——支付团队主张优化支付失败提示(减少用户流失),设计…

缓存中间件

缓存与分布式锁 即时性、数据一致要求不高的 访问量大且更新频率不高的数据 (读多,写少) 常用缓存中间件 redis Spring 如果用spring的情况下,由于redis没有受spring的管理, 则我们需要自己先写一个redis的配置类&…