Elasticsearch-使用映射来定义各种文档

ES-使用映射来定义各种文档

每篇文档属于一种类型,而每种类型属于一个索引。从数据的逻辑划分来看,可以认为索引是数据库,而类型是数据库中的表。
类型包含了映射中每个字段的定义。映射包括了该类型的文档中可能出现的所有字段,并告诉ES如何索引一篇文档的多个字段。

类型只提供逻辑上的分离:
在ES中,不同类型的文档没有物理上的分离。在同一个ES索引中的所有文档,无论何种类型,都是存储在属于相同分片的同一组文件中。一份分片就是一个Lucene的索引,类型的名称是Lucene索引中一个字段。所有映射的所有字段都是Lucene索引中的字段。
类型的概念是针对ES的一层抽象,但不属于Lucene。可以轻松地在同一个索引中拥有不同类型的文档。ES负责分离这些文档,在某个类型中搜索时,ES会过滤出属于哪个类型的文档。
当多个类型中出现同样的字段名称时,两个同名的字段应该有同样的设置。否则,ES将很难分辨查询时指的是两个字段中的哪一个。两个字段都是属于同一个Lucene索引。

 


group(分组)和event(活动)存储在不同的类型中。ES允许在一个类型、多个类型中搜索。

1. 检索和定义映射

1.1获取目前的映射

为了查看某个字段类型当前的映射,向该类型URL的_mapping接口发送一个HTTP GET请求

复制代码
FengZhendeMacBook - Pro: bin FengZhen$ curl 'localhost:9200/music/singer/_mapping?pretty' {
    "music": {
        "mappings": {
            "singer": {
                "properties": {
                    "level": {
                        "type": "string"
                    },
                    "name": {
                        "type": "string"
                    }
                }
            }
        }
    }
}
复制代码

 

新建一个专辑类型album,并索引一篇新文档

FengZhendeMacBook - Pro: bin FengZhen$ curl - XPUT 'localhost:9200/music/album/1' - d '{
"name": "八度空间",
"date": "2003-10-25T19:00"
}'

 

获取当前类型映射

复制代码
FengZhendeMacBook - Pro: bin FengZhen$ curl 'localhost:9200/music/album/_mapping?pretty' {
    "music": {
        "mappings": {
            "album": {
                "properties": {
                    "date": {
                        "type": "date",
                        "format": "strict_date_optional_time||epoch_millis"
                    },
                    "name": {
                        "type": "string"
                    }
                }
            }
        }
    }
}
复制代码


可看到date字段自动识别为日期类型

1.2定义新的映射

在索引music的album类型中,新增一个字段映射singer,类型为string

复制代码
FengZhendeMacBook - Pro: bin FengZhen$ CURL - XPUT 'localhost:9200/music/_mapping/album' - d '{
    "album": {
        "properties": {
            "singer": {
                "type": "string"
            }
        }
    }
}'
复制代码

 

查看album的映射

复制代码
FengZhendeMacBook - Pro: bin FengZhen$ curl 'localhost:9200/music/album/_mapping?pretty' {
    "music": {
        "mappings": {
            "album": {
                "properties": {
                    "date": {
                        "type": "date",
                        "format": "strict_date_optional_time||epoch_millis"
                    },
                    "name": {
                        "type": "string"
                    },
                    "singer": {
                        "type": "string"
                    }
                }
            }
        }
    }
}
复制代码

 

2.扩展现有的映射

如果在现有的基础上再设置一个映射,ES会将两者合并。如上述映射,包含两个来自初始映射的字段,外加定义的一个新字段。随着新字段的加入,初始的映射被扩展了,在任何时候都可以进行这样的操作,ES将次称为现有映射和先前提供的映射的合并。
但是,并非所有的合并都是奏效的,例如:无法改变现有字段的数据类型,而且通常无法改变一个字段被索引的方式。
试图改变singer类型为long,操作会失败并抛出异常

复制代码
FengZhendeMacBook - Pro: bin FengZhen$ CURL - XPUT 'localhost:9200/music/_mapping/album?pretty' - d '{
    "album": {
        "properties": {
            "singer": {
                "type": "long"
            }
        }
    }
}'

{
    "error": {
        "root_cause": [{
            "type": "illegal_argument_exception",
            "reason": "mapper [singer] of different type, current_type [string], merged_type [long]"
        }],
        "type": "illegal_argument_exception",
        "reason": "mapper [singer] of different type, current_type [string], merged_type [long]"
    },
    "status": 400
}
复制代码

 

避免这个错误唯一的方法是重新索引album里的所有数据,步骤如下
(1) 将album类型里的所有数据删除。
(2) 设置新的映射
(3) 再次索引所有的数据 

posted on   嘣嘣嚓  阅读(911)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2018-06-22 Docker-为镜像添加SSH服务

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示