IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Elasticsearch中的Mapping -> 正文阅读

[大数据]Elasticsearch中的Mapping

1.什么是Mapping?

Mapping用于定义文档的结构以及文档所包含属性(fields)如何被存储和索引。
被ES索引的文档本质就是一些或者称为属性的集合,每一个都可以有自己的数据类型。
每一个mapping都包含了一个文档必要的属性列表,还可以包含元数据属性(metadata fields),例如_source,它用于自定义如何处理文档的关联元数据。

一句话概括,Mapping用于定义要索引文档的结构及如何被索引。

ES支持两种Mapping的创建方式:

  • Dynamic Mapping:动态Mapping
  • Explicit Mapping:显式Mapping

2. 动态Mapping

2.1 什么是动态Mapping

ES根据你索引的文档数据,进行自动推算文档属性的数据类型等其他动作,生成对应的Mapping,这就是动态Mapping。Elasticsearch在索引文档自动添加新字段。可以向顶级映射、内部对象和嵌套字段添加字段。
动态Mapping一般我们只在试验时或者研究数据时才会使用。因为ES自动推算生成的mapping不一定合理。

当索引文档时,如果ES发现文档中有新增加的属性,默认情况下会自动对应增加新属性的mappingdynamic参数控制这个行为。
当启用动态字段映射时,Elasticsearch使用下表中的规则来确定如何映射每个字段的数据类型:

JSON 数据类型“dynamic”:“true”“dynamic”:“runtime”
null不添加属性mapping不添加属性的mapping
true or falsebooleanboolean
doublefloatdouble
integerlonglong
objectobjectNo field added
array取决于第一个非null元素的类型取决于第一个非null元素的类型
日期格式的字符串datedate
数字型的字符串float or longdouble or long
非日期或数字格式的字符串带子属性keyword的textkeyword

2.2 实战

下面测试的ES版本为7.6.2,不同版本测试结果可能会有差别!

看下面的例子:
我们首先创建一个索引books:

curl -L -X PUT 'http://192.168.1.102:9200/books' \
-H 'content-type: application/json'
# Output
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "books"
}

查看books索引定义:

curl -L -X GET 'http://192.168.1.102:9200/books' \
-H 'content-type: application/json'
# Output
{
    "books": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "creation_date": "1629541289738",
                "number_of_shards": "1",
                "number_of_replicas": "1",
                "uuid": "vnI7XlebTraIMhA6CgYBSw",
                "version": {
                    "created": "7060299"
                },
                "provided_name": "books"
            }
        }
    }
}

可以发现ES帮我们生成的索引定义中,mappings默认是空的。

添加一条数据到索引books:

curl -L -X POST 'http://192.168.1.102:9200/books/1' \
-H 'content-type: application/json' \
-d '{
    "name":"c++ primer plus第六版",
    "version":"6",
    "pubilsher":"人民邮电出版社",
    "ISBN":"9787115521644",
    "publish_time":"2020-07-01"
}'
# Output
{
    "_index": "books",
    "_type": "1",
    "_id": "zOtEaHsBi66Hodhos5sq",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

查看books索引mapping定义:

curl -L -X GET 'http://192.168.1.102:9200/books/_mappings'
{
    "books": {
        "mappings": {
            "properties": {
                "ISBN": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "pubilsher": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "publish_time": {
                    "type": "date"
                },
                "version": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

可以发现,publish_time被自动映射成了date数据类型。其他字段被映射成了带子属性keywordtext数据类型。

我们再添加一条数据到books索引,这次我们增加一个属性price:

curl -L -X POST 'http://192.168.1.102:9200/books/1' \
-H 'content-type: application/json' \
-d '{
    "name":"c++ primer plus第六版",
    "version":"6",
    "pubilsher":"人民邮电出版社",
    "ISBN":"9787115521644",
    "publish_time":"2020-07-01",
    "price": 106.2
}'

再次查看books索引mapping定义:

curl -L -X GET 'http://192.168.1.102:9200/books/_mappings' \
-H 'content-type: application/json'
{
    "books": {
        "mappings": {
            "properties": {
                "ISBN": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "price": {
                    "type": "float"
                },
                "pubilsher": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "publish_time": {
                    "type": "date"
                },
                "version": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

ES帮我们自动增加pricemapping,并且自动推断为float数据类型。

这就是dynamic mapping动态mapping。

3. 显式Mapping

3.1 什么是显示Mapping

显式Mapping允许我们精确地选择如何定义映射,例如:

  • 哪些字符串字段应被视为全文字段。
  • 字段索引时的分词器
  • 字段的数据类型
  • 日期的格式
  • 控制动态添加字段的映射的自定义规则
  • 等等
    显示定义Mapping意味着我们对Mapping定义有最大的控制权。

3.2 实战

看下面的例子:
我们首先创建一个索引books,并显示指定mapping定义:

curl -L -X PUT 'http://192.168.1.102:9200/books/' \
-H 'content-type: application/json' \
-d '{
    "mappings": {
        "properties": {
            "ISBN": {
                "type": "keyword"
            },
            "name": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "price": {
                "type": "float"
            },
            "pubilsher": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "publish_time": {
                "type": "date"
            },
            "version": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    }
}'

我们指定了ISBN的数据类型为keyword,这意味着我们不需要以此字段做全文检索。

查看books索引定义:

curl -L -X GET 'http://192.168.1.102:9200/books/'
{
    "books": {
        "aliases": {},
        "mappings": {
            "properties": {
                "ISBN": {
                    "type": "keyword"
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "price": {
                    "type": "float"
                },
                "pubilsher": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "publish_time": {
                    "type": "date"
                },
                "version": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        },
        "settings": {
            "index": {
                "creation_date": "1629542862041",
                "number_of_shards": "1",
                "number_of_replicas": "1",
                "uuid": "hLc2e35ZR1OuGxK-B2i1bg",
                "version": {
                    "created": "7060299"
                },
                "provided_name": "books"
            }
        }
    }
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:36:15  更:2021-08-22 13:36:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:33:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码