本文转自: https://blog.youkuaiyun.com/chengyuqiang/article/details/79048584
在ElasticSearch中Index(索引)相当于数据库, type字段类似于表(Type字段在以后的ES中将被废弃),映射(Mapping)相当于数据表的表结构。ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等等。
Mapping(映射)可以分为2种, 动态映射和静态映射
1, 动态映射;
我们知道,在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据。而ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。
2,静态映射
ElasticSearch中也可以事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。
动态映射示例:
1,新建索引:
PUT book
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "book"
}
2, 查看Mapping, 此时由于只创建了一个空的book索引, 所以mapping会为空
GET book/_mapping
{
"book": {
"mappings": {}
}
}
3, 插入文档
it类型表示IT类书籍
PUT book/it/1
{
"bookId":1,
"bookName":"Java程序设计",
"publishDate":"2018-01-12"
}
{
"_index": "book",
"_type": "it",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
4, 再次查看映射
GET book/_mapping
{
"book": {
"mappings": {
"it": {
"properties": {
"bookId": {
"type": "long"
},
"bookName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"publishDate": {
"type": "date"
}
}
}
}
}
}
5, 解读
bookId字段推测为long型,bookName字段推测为text类型,publishDate字段推测为date类型,这些推测都是我们可以接受的。可见ElasticSearch的动态映射十分强大。
动态映射规则
动态映射可以帮助我们在创建索引后直接将文档数据写入ElasticSearch,让我们尽快享受到ElasticSearch检索功能。在实际项目中,如果在导入数据前不能确定包含哪些字段或者不方便确定字段类型,可以使用动态映射。当向ElasticSearch写入一个新文档时,需要一个之前没有的字段,会通过动态映射来推断该字段类型。
ElasticSearch动态映射规则如下。
JSON数据 | 自动推测的类型 |
---|---|
null | 没有字段被添加 |
true或false | boolean型 |
小数 | float型 |
数字 | long型 |
日期 | date或text |
字符串 | text |
数组 | 由数组第一个非空值决定 |
JSON对象 | object类型 |
静态映射
动态映射的自动类型推测功能并不是100%正确的,这就需要静态映射机制。静态映射与关系数据库中创建表语句类型,需要事先指定字段类型。相对于动态映射,静态映射可以添加更加详细字段类型、更精准的配置信息等。
1, 新建映射
在6.x中创建的索引只允许每个索引有单一类型。任何名字都可以用于这个类型,但是只能有一个。
PUT books
{
"mappings":{
"it": {
"properties": {
"bookId": {"type": "long"},
"bookName": {"type": "text"},
"publishDate": {"type": "date"}
}
}
}
}
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "books"
}
2, 查看映射
GET books/_mapping
{
"books": {
"mappings": {
"it": {
"properties": {
"bookId": {
"type": "long"
},
"bookName": {
"type": "text"
},
"publishDate": {
"type": "date"
}
}
}
}
}
}
3, 插入文件数据
PUT books/it/1
{
"bookId":"1",
"bookName":"Java",
"publishDate":"2018-01-12"
}
{
"_index": "books",
"_type": "it",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
4, 检索
GET books/it/1
{
"_index": "books",
"_type": "it",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"bookId": "1",
"bookName": "Java",
"publishDate": "2018-01-12"
}
}
静态+动态
PUT books/it/2
{
"bookId":"2",
"bookName":"Hadoop",
"author":"chengyuqiang",
"publishDate":"2018-01-13"
}
{
"_index": "books",
"_type": "it",
"_id": "2",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 2
}
GET books/_mapping
{
"books": {
"mappings": {
"it": {
"properties": {
"author": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"bookId": {
"type": "long"
},
"bookName": {
"type": "text"
},
"publishDate": {
"type": "date"
}
}
}
}
}
}