Elasticsearch 概念与基础实操 (索引、映射与文档操作)(黑马微服务课day12)
本文介绍了Elasticsearch的核心概念与基础操作,重点讲解了正向索引与倒排索引的区别,中文分词器IK的使用方法,以及ES与MySQL的概念对比。文章详细阐述了Mapping映射属性的配置,并通过实例演示了索引库的CRUD操作(创建、查询、修改、删除)和文档的增删改查操作,包括批处理(_bulk)的高效用法。最后强调ES索引库一旦创建后Mapping字段不可修改的重要特性。
Elasticsearch 概念与基础实操 (索引、映射与文档操作)
在海量数据的搜索与分析场景中,Elasticsearch (简称 ES) 凭借其分布式、高扩展和近实时的搜索特性,成为了众多开发者的首选。因此了解es的使用的原理和操作必不可少
Rabbit高级篇的总结内容:RabbitMQ高级篇总结
Rabbit入门篇的总结内容:Rabbit入门篇总结
📚 目录(点击跳转对应章节)
1. 核心概念:正向索引与倒排索引
2. 中文分词利器:IK 分词器
3. ES 与 MySQL 概念对比
4. Mapping 映射属性
5. 索引库操作 (Index CRUD)
6. 文档操作 (Document CRUD)
1. 核心概念:正向索引与倒排索引
理解 ES 的高效查询,首先要理解它的索引机制。
- 正向索引:类似传统关系型数据库的主键查询,通过 ID 找内容。如果是模糊查询(如
LIKE),需要全表扫描,效率极低。
- 倒排索引:ES 搜索的核心。它将文档内容进行分词,提取出词条(Term),并记录该词条所在的文档 ID 列表。搜索时,先对关键词分词,再去词条列表中快速定位文档 ID,最后根据 ID 获取文档。这种方式极大地提高了全文检索的速度。

小结

2. 中文分词利器:IK 分词器
倒排索引依赖于分词,而 ES 默认的标准分词器对中文支持很不友好(会将中文逐字切分)。在实际项目中,我们通常会接入 IK 分词器。
IK 分词器提供两种常用的分词模式:
-
ik_smart:最少切分,追求粗粒度的精准。

-
ik_max_word:最细切分,穷尽词库的可能,适合搜索场景。

拓展分词词库中的词条:
3. ES 与 MySQL 概念对比
为了方便具备关系型数据库背景的开发者理解,我们可以将 ES 的概念与 MySQL 进行类比:
- MySQL:数据库 (Database) -> 表 (Table) -> 行 (Row) -> 列 (Column)
- Elasticsearch:索引库 (Index) -> 类型 (Type,ES 7.x 之后已废弃,默认
_doc) -> 文档 (Document) -> 字段 (Field)
此外,ES 的 Mapping 映射就相当于 MySQL 中的表结构定义(Schema)。
4. Mapping 映射属性
Mapping 是对索引库中整篇文档及其包含字段的结构定义。常见的数据类型包括:
- 字符串:
text(可分词的文本)、keyword(精确值,如品牌、邮箱,不分词) - 数值:
long,integer,short,byte,double,float - 布尔:
boolean - 日期:
date - 对象:
object(JSON 嵌套)
核心注意:只有
text类型的字段需要进行分词,并可以配置analyzer属性。
具体实例:
5. 索引库操作 (Index CRUD)
RESTful API 风格贯穿了整个 ES 操作。对于索引库的操作,核心原则是:一旦创建,无法修改已有的 Mapping 字段(因为这会导致原有倒排索引失效),但可以新增字段。
5.1 创建索引库和映射
使用 PUT 请求,明确表达“创建或覆盖”的语义。
PUT /heima
{
"mappings": {
"properties": {
"info":{
"type": "text",
"analyzer": "ik_smart"
},
"email":{
"type": "keyword",
"index": false
},
"name":{
"properties": {
"firstName": {
"type": "keyword"
}
}
}
}
}
}
5.2 查询索引库
使用 GET 请求。
GET /heima
5.3 修改索引库 (仅限新增字段)
使用 PUT 向已有的 mapping 中追加新字段。
PUT /heima/_mapping
{
"properties": {
"age":{
"type": "integer"
}
}
}
倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping。
虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。因此修改索引库能做的就是向索引库中添加新字段,或者更新索引库的基础属性。
5.4 删除索引库
使用 DELETE 请求。
DELETE /heima
6. 文档操作 (Document CRUD)
对具体数据的增删改查同样遵循 RESTful 原则。
6.1 新增文档
使用 POST 请求,并指定索引库、_doc 以及文档 ID。
POST /heima/_doc/1
{
"info": "黑马程序员Java讲师",
"email": "zy@itcast.cn",
"name": {
"firstName": "云",
"lastName": "赵"
}
}
6.2 查询文档
使用 GET 请求加文档 ID。
GET /heima/_doc/1
6.3 删除文档
使用 DELETE 请求加文档 ID。
DELETE /heima/_doc/1
6.4 修改文档
ES 的修改分为全量修改和局部修改:
全量修改 (PUT):底层逻辑是先根据 ID 删除旧文档,再新增同 ID 文档。如果原 ID 不存在,则直接变为新增操作。
PUT /heima/_doc/1
{
"info": "黑马程序员高级Java讲师",
"email": "zy@itcast.cn",
"name": {
"firstName": "云",
"lastName": "赵"
}
}
局部修改 (POST + _update):仅修改指定的字段值。
POST /heima/_update/1
{
"doc": {
"email": "ZhaoYun@itcast.cn"
}
}
6.5 批处理 (Bulk)
在处理大量数据时,使用 _bulk 接口可以极大提高网络吞吐量。批处理的内容格式比较特殊,每一组操作由两行 JSON 组成(操作类型与元数据 + 操作的实际数据)。
批量新增示例:
POST /_bulk
{"index": {"_index":"heima", "_id": "3"}}
{"info": "黑马程序员C++讲师", "email": "ww@itcast.cn", "name":{"firstName": "五", "lastName":"王"}}
{"index": {"_index":"heima", "_id": "4"}}
{"info": "黑马程序员前端讲师", "email": "zhangsan@itcast.cn", "name":{"firstName": "三", "lastName":"张"}}
批量删除示例:
POST /_bulk
{"delete":{"_index":"heima", "_id": "3"}}
{"delete":{"_index":"heima", "_id": "4"}}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)