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

ElasticSearch快速入门-1

文章目录

  • 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.lryc.cn/news/579807.html

相关文章:

  • MSPM0G3507学习笔记(一) 重置版:适配逐飞库的ti板环境配置
  • 服装零售企业跨区域运营难题破解方案
  • 如何将大型视频文件从 iPhone 传输到 PC
  • PoE 延长器——让网络部署更自由
  • 第十章:HIL-SERL 真实机器人训练实战
  • Docker拉取bladex 、 sentinel-dashboard
  • 【阿里巴巴JAVA开发手册】IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式,不要使用Windows格式。
  • Android BitmapRegionDecoder 详解
  • Java启动脚本
  • vue create 和npm init 创建项目对比
  • error MSB8041: 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。
  • React 渲染深度解密:从 JSX 到 DOM 的初次与重渲染全流程
  • 最快实现的前端灰度方案
  • 因果语言模型、自回归语言模型、仅解码器语言模型都是同一类模型
  • 同步(Synchronization)和互斥(Mutual Exclusion)关系
  • 【机器人】复现 DOV-SG 机器人导航 | 动态开放词汇 | 3D 场景图
  • (超详细)数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)
  • 敏捷开发在国际化团队管理中的落地
  • 二维码驱动的独立站视频集成方案
  • 碰一碰发视频源码搭建与定制化开发:支持OEM
  • 译码器Multisim电路仿真汇总——硬件工程师笔记
  • TensorFlow 安装使用教程
  • MySQL数据库----DML语句
  • 【2.4 漫画SpringBoot实战】
  • 【模糊集合】示例
  • vue-37(模拟依赖项进行隔离测试)
  • Unity Android与iOS自动重启
  • uniapp打包微信小程序主包过大问题_uniapp 微信小程序时主包太大和vendor.js过大
  • 《导引系统原理》-西北工业大学-周军-“2️⃣导引头的角度稳定系统”
  • 暑期前端训练day3