索引库、文档操作

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文介绍了Elasticsearch的核心概念及操作,对比MySQL,解析其文档、字段、索引、映射等对应关系。详细讲解了索引库的创建、查询、修改与删除,以及文档的增删改查操作,并介绍IK分词器的使用与拓展方式,帮助读者掌握ES数据管理基础。

在前面读者朋友们可以了解到ES承载着和MySQL一样的“存储-查询”功能,那么就类似的会有建表语句、表结构、表数据,有了这些才可以存储-查询数据。而这些对应的在ES中是:Mapping映射(表结构-建表语句)、索引库(表本身)、文档(表数据)。本节笔者将带领大家完整上述概念的创建、使用。
1.es的一些概念
elasticsearch中有很多独有的概念,与mysql中略有差别,但也有相似之处。
1.1.文档和字段
elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中:

而Json文档中往往包含很多的字段(Field),类似于数据库中的列。
1.2.索引和映射
索引(Index),就是相同类型的文档的集合。例如:
● 所有用户文档,就可以组织在一起,称为用户的索引;
● 所有商品的文档,可以组织在一起,称为商品的索引;
● 所有订单的文档,可以组织在一起,称为订单的索引;
因此,我们可以把索引当做是数据库中的表。
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。

1.3.mysql与elasticsearch
我们统一的把mysql与elasticsearch的概念做一下对比:
MySQL Elasticsearch 说明
Table Index 索引(index),就是文档的集合,类似数据库的表(table)
Row Document 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
Column Field 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
Schema Mapping Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQL DSL DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD
是不是说,我们学习了elasticsearch就不再需要mysql了呢?并不是如此,两者各自有自己的擅长支出:
● Mysql:擅长事务类型操作,可以确保数据的安全和一致性
● Elasticsearch:擅长海量数据的搜索、分析、计算
因此在企业中,往往是两者结合使用:
● 对安全性要求较高的写操作,使用mysql实现
● 对查询性能要求较高的搜索需求,使用elasticsearch实现
● 两者再基于某种方式,实现数据的同步,保证一致性

1.4.安装es、kibana
1.4.1.安装
参考:链接
1.4.2.分词器
参考:链接
1.4.3.总结
分词器的作用是什么?
● 创建倒排索引时对文档分词
● 用户搜索时,对输入的内容分词
IK分词器有几种模式?
● ik_smart:智能切分,粗粒度
● ik_max_word:最细切分,细粒度
IK分词器如何拓展词条?如何停用词条?
● 利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典
● 在词典中添加拓展词条或者停用词条
2.索引库操作
索引库就类似数据库表,mapping映射就类似表的结构。我们要向es中存储数据,必须先创建“库”和“表”。
2.1.mapping映射属性
mapping是对索引库中文档的约束,常见的mapping属性包括:
● type:字段数据类型,常见的简单类型有:
○ 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
○ 数值:long、integer、short、byte、double、float、
○ 布尔:boolean
○ 日期:date
○ 对象:object
● index:是否创建索引,默认为true
● analyzer:使用哪种分词器
● properties:该字段的子字段
例如下面的json文档:
{
"age": 21,
"weight": 52.1,
"isMarried": false,
"info": "黑马程序员Java讲师",
"email": "zy@itcast.cn",
"score": [99.1, 99.5, 98.9],
"name": {
"firstName": "云",
"lastName": "赵"
}
}
对应的每个字段映射(mapping):
● age:类型为 integer;参与搜索,因此需要index为true;无需分词器
● weight:类型为float;参与搜索,因此需要index为true;无需分词器
● isMarried:类型为boolean;参与搜索,因此需要index为true;无需分词器
● info:类型为字符串,需要分词,因此是text;参与搜索,因此需要index为true;分词器可以用ik_smart
● email:类型为字符串,但是不需要分词,因此是keyword;不参与搜索,因此需要index为false;无需分词器
● score:虽然是数组,但是我们只看元素的类型,类型为float;参与搜索,因此需要index为true;无需分词器
● name:类型为object,需要定义多个子属性
○ name.firstName;类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器
○ name.lastName;类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器
2.2.索引库的CRUD
这里我们统一使用Kibana编写DSL的方式来演示。
2.2.1.创建索引库和映射
基本语法:
● 请求方式:PUT
● 请求路径:/索引库名,可以自定义
● 请求参数:mapping映射
格式:
PUT /索引库名称
{
"mappings": {
"properties": {
"字段名":{
"type": "text",
"analyzer": "ik_smart"
},
"字段名2":{
"type": "keyword",
"index": "false"
},
"字段名3":{
"properties": {
"子字段": {
"type": "keyword"
}
}
},
// ...略
}
}
}
示例:
PUT /heima
{
"mappings": {
"properties": {
"info":{
"type": "text",
"analyzer": "ik_smart"
},
"email":{
"type": "keyword",
"index": "false"
},
"name":{
"properties": {
"firstName": {
"type": "keyword"
}
}
},
// ... 略
}
}
}
2.2.2.查询索引库
基本语法:
● 请求方式:GET
● 请求路径:/索引库名
● 请求参数:无
格式:
GET /索引库名
示例:

2.2.3.修改索引库
倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping。虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。
语法说明:
PUT /索引库名/_mapping
{
"properties": {
"新字段名":{
"type": "integer"
}
}
}
示例:

2.2.4.删除索引库
语法:
● 请求方式:DELETE
● 请求路径:/索引库名
● 请求参数:无
格式:
DELETE /索引库名
在kibana中测试:

2.2.5.总结
索引库操作有哪些?
● 创建索引库:PUT /索引库名
● 查询索引库:GET /索引库名
● 删除索引库:DELETE /索引库名
● 添加字段:PUT /索引库名/_mapping
3.文档操作
3.1.新增文档
语法:
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
},
// ...
}
示例:
POST /heima/_doc/1
{
"info": "黑马程序员Java讲师",
"email": "zy@itcast.cn",
"name": {
"firstName": "云",
"lastName": "赵"
}
}
响应:

针对同一个index,其中version在每次写操作后都会+1(新增、修改、删除)

3.2.查询文档
根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把文档id带上。
语法:
GET /{索引库名称}/_doc/{id}
通过kibana查看数据:
GET /heima/_doc/1
查看结果:

3.3.删除文档
删除使用DELETE请求,同样,需要根据id进行删除:
语法:
DELETE /{索引库名}/_doc/id值
示例:

根据id删除数据

DELETE /heima/_doc/1
结果:

3.4.修改文档
修改有两种方式:
● 全量修改:直接覆盖原来的文档
● 增量修改:修改文档中的部分字段
3.4.1.全量修改
全量修改是覆盖原来的文档,其本质是:
● 根据指定的id删除文档
● 新增一个相同id的文档
注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。
语法:
PUT /{索引库名}/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
// ... 略
}
示例:
PUT /heima/_doc/1
{
"info": "黑马程序员高级Java讲师",
"email": "zy@itcast.cn",
"name": {
"firstName": "云",
"lastName": "赵"
}
}
3.4.2.增量修改
增量修改是只修改指定id匹配的文档中的部分字段。
语法:
POST /{索引库名}/_update/文档id
{
"doc": {
"字段名": "新的值",
}
}
示例:
POST /heima/_update/1
{
"doc": {
"email": "ZhaoYun@itcast.cn"
}
}
3.5.总结
文档操作有哪些?
● 创建文档:POST /{索引库名}/_doc/文档id { json文档 }
● 查询文档:GET /{索引库名}/_doc/文档id
● 删除文档:DELETE /{索引库名}/_doc/文档id
● 修改文档:
○ 全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
○ 增量修改:POST /{索引库名}/_update/文档id { "doc": {字段}}
4.RestAPI
ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html
其中的Java Rest Client又包括两种:
● Java Low Level Rest Client
● Java High Level Rest Client

相关文章
|
13天前
|
数据采集 人工智能 安全
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
661 4
|
8天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
350 164
|
7天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
359 155