基本操作
约 1085 字大约 4 分钟
2025-02-28
索引库的操作
索引库就类似数据库表,mapping映射就类似表的结构。
要向es中存储数据,必须先创建“库”和“表”
Mapping
Mapping是es中用来定义字段类型和属性的。
Mapping是对索引库中文档的约束,常见的mapping属性包括:
- type:字段类型,常见的简单类型有
相关信息
- 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)keyword类型只能整体搜索,不支持搜索部分内容
- 数值:long、integer、short、byte、double、float
- 布尔:boolean
- 日期:date
- 复杂类型:object、nested、geo_point、geo_shape、completion
- index:是否索引,true或false
- store:是否存储,true或false
- analyzer:分词器,用于分词处理
- fields:复杂类型字段的子字段,用于定义子字段的mapping属性
创建索引库和映射
基本语法:
- 请求方式:PUT
- 请求路径:/索引库名,可以自定义
- 请求参数:mapping映射
PUT /{index}
{
"mappings": { # 定义mapping
"{type}": { # 定义类型, 如doc。如果没有定义,则默认为_doc
"properties": { # 定义字段
"{field}": { # 定义字段名, 如name
"type": "{type}", # 定义字段类型, 如text
"index": true, # 是否索引, true
"store": true, # 是否存储
"analyzer": "standard", # 分词器
"fields": { # 定义子字段
"{sub_field}": { # 定义子字段名
"type": "{type}", # 定义子字段类型
"index": true, # 是否索引
"store": true # 是否存储
}
}
}
}
}
}
}
例如:
# 创建索引库
PUT /user
{
"mappings": { // 结构
"properties": { // 属性
"username": { // 属性名
"type": "keyword" // 属性类型,keyword 关键字,表示不需要分词
},
"age": {
"type": "integer",
"index": false // 不创建索引
},
"info": {
"type": "text",
"analyzer": "ik_smart"
},
"child": {
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer",
"index": false
}
}
},
"createTime": {
"type": "date", //时间类型
"format": "yyyy-MM-dd HH:mm:ss", //约定时间格式
"index": false
}
}
}
}
查询索引库
基本语法:
- 请求方式:GET
- 请求路径:/索引库名/_search
- 请求参数:无
GET /索引库名
删除索引库
基本语法:
- 请求方式:DELETE
- 请求路径:/索引库名
DELETE /索引库名
修改索引库
基本语法:
- 请求方式:PUT
- 请求路径:/索引库名/_mapping
- 请求参数:修改参数
倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping。 虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。
PUT /索引库名/_mapping
{
"properties": {
"新字段名":{
"type": "integer"
}
}
}
文档操作
文档是索引库中的数据记录,可以理解为数据库表中的一条记录。
新增文档
语法:
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
},
// ...
}
案例:
查询文档
根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把文档id带上,表示查询某个文档。 语法:
GET /{索引库名称}/_doc/{id}
//批量查询:查询该索引库下的全部文档
GET /{索引库名称}/_search
案例:
删除文档
语法:
DELETE /{索引库名称}/_doc/{id}
案例:
修改文档:
修改有两种方式:
- 全量修改:直接覆盖原来的文档
- 增量修改:修改文档中的部分字段
全量修改
全量修改是覆盖原来的文档,其本质是:
- 根据指定的id删除文档
- 新增一个相同id的文档
注意
注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。 语法: json PUT /{索引库名}/_doc/文档id { "字段1": "值1", "字段2": "值2", // ... 略 }
案例: #### 增量修改 增量修改是只修改指定id匹配的文档中的部分字段。
语法:
POST /{索引库名}/_update/文档id
{
"doc": {
"字段名": "新的值",
}
}
案例