mapping是对索引库中文档的约束,常见的mapping熟悉包括:
type:字段数据类型,常见的简单类型有:
index:是否创建索引,默认为true
analyzer:使用那种分词器(一般只结合text类型使用)
properties:该字段的子字段
ES中通过Restful请求操作索引库、文档。请求内容用DSL语句来表示。创建索引库和mapping的DSL语法如下:
PUT /huaijiu # 创建的索引库名称
{
"mappings": { # 所有属性值写在mappings下面
"properties": { # 表示其中一个属性
"info": { # 一个属性的名称
"type": "text", # 属性的类型
"analyzer": "ik_smart" # 指定创建索引的分词器
},
"email": {
"type": "text",
"index": false # 指定当前字段不创建索引
},
"user": {
"type": "object",
"properties": {
"name": {
"type": "text",
"index": false
},
"age": {
"type": "integer",
"index": false
}
}
}
}
}
}
GET /huaijiu
put /huaijiu/_mapping
{
"properties": {
"score": {
"type": "integer",
"index": false
}
}
}
delete /huaijiu
删除后再次查询:
# 语法: POST /文档名称/_doc/索引id { 内容json }
POST /huaijiu/_doc/1
{
"info": "怀旧是真的强啊,太酷啦,奥利给!",
"email": "444915368@qq.com",
"user": {
"name": "怀旧",
"age": 18
}
}
注意右边返回到 _version 试根据你修改的次数依次累加的:例如新增、删除、修改都会让version的值+1
# 语法:GET /文档名称/_doc/索引id
GET /huaijiu/_doc/1
# 语法:DELETE /文档名称/_doc/索引id
DELETE /huaijiu/_doc/1
全亮修改,回删除旧文档,添加新文档
# 语法和新增一样,直接改变内容即可
PUT /huaijiu/_doc/1
{
"info": "怀旧是真的强啊,太酷啦,奥利给!",
"email": "123321@qq.com",
"user": {
"name": "怀旧",
"age": 18
}
}
再次执行查询,结果已经发生改变
增量修改,修改指定字段值
# 语法是,编写了哪些字段才针对于哪些字段进行修改(这里修改的时候,需要在外边包一层doc才能进行修改,请求方式也和方式一不一样,这边是POST)
POST /huaijiu/_update/1
{
"doc":{
"email": "123456@qq.com"
}
}
再次执行查询,结果已经发生改变
对比两者的差别:
方式一在修改的时候,如果只修改一个字段的内容,那么其他没有写的字段直接默认为空,但是方式二修改的,其他没有填充的字段值内容和原来的数据不变
查询方式一修改后的结果:
其他的值直接没有了!
**作用:**在对于日志或者其他较大的数据做映射的时候,我们可能会进行将索引拆分(建立多个索引分别存储数据),但是我们在进行数据查询的时候,需要吧所有的数据联合到一起进行查询,这时候别名就可以起到作用了。
没有别名的时候的做法:
首先建立三个索引来代表三个不同的日志文件:
put /log_1
put /log_2
put /log_3
给每个索引添加mapping
# 注意,每个不同的索引,mapping结构保持一致
post /log_(1/2/3 表示三个不同的索引)/_mapping
{
"properties": {
"name": {
"type": "text"
},
"time": {
"type": "text"
}
}
}
现在给每个索引都加入一些数据:
post /log_1/_create/1
{
"name": "日志1",
"time": "第1根"
}
post /log_1/_create/2
{
"name": "日志2",
"time": "第2根"
}
post /log_2/_create/3
{
"name": "日志3",
"time": "第3根"
}
post /log_2/_create/4
{
"name": "日志4",
"time": "第4根"
}
post /log_3/_create/5
{
"name": "日志5",
"time": "第5根"
}
post /log_3/_create/6
{
"name": "日志6",
"time": "第6根"
}
现在我们想要这三个索引的数据同时查询出来,我们的写法可以是:
get log_1,log_2,log_3/_search
查询结果如下:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "log_1",
"_id": "1",
"_score": 1,
"_source": {
"name": "日志1",
"time": "第1根"
}
},
{
"_index": "log_1",
"_id": "2",
"_score": 1,
"_source": {
"name": "日志2",
"time": "第2根"
}
},
{
"_index": "log_2",
"_id": "3",
"_score": 1,
"_source": {
"name": "日志3",
"time": "第3根"
}
},
{
"_index": "log_2",
"_id": "4",
"_score": 1,
"_source": {
"name": "日志4",
"time": "第4根"
}
},
{
"_index": "log_3",
"_id": "5",
"_score": 1,
"_source": {
"name": "日志5",
"time": "第5根"
}
},
{
"_index": "log_3",
"_id": "6",
"_score": 1,
"_source": {
"name": "日志6",
"time": "第6根"
}
}
]
}
}
通过输出可以看见,能够达成我们想要的效果
现在我们通过别名的方式,改良一下:
post _aliases
{
"actions": [
{
"add": {
"index": "log_1",
"alias": "log"
}
},
{
"add": {
"index": "log_2",
"alias": "log"
}
},
{
"add": {
"index": "log_3",
"alias": "log"
}
}
]
}
给三个索引添加上了相同的别名,现在通过别名直接进行查询
get log/_search
查看结果,发现和 get log_1,log_2,log_3/_search 这种方式结果一样:
注意:在查询的时候,我们可以通过别名进行查询,但是在新增、删除和修改,还是需要使用原有的索引名称单独进行
评论
登录后才可以进行评论哦!