目录
本系列正在更新,点击下方查看
- 【Elasticsearch】使用IMDB学习ES(1)准备数据集
- 【Elasticsearch】使用IMDB学习ES(2)docker搭建环境
- 【Elasticsearch】使用IMDB准备ES学习用数据集(3) 设计映射结构
理解字段含义
根据第一步我们使用python脚本扫描出的文本结构,我们可以得到每行数据的结构如下
{
'titleId': 'tt0012941',
'ordering': '3',
'title': 'Billy Jim',
'region': 'US',
'language': '\\N',
'types': '\\N',
'attributes': '\\N',
'isOriginalTitle': '0'
}
根据官网给出的描述,可以按如下理解对应字段
- titleId 唯一标识
- ordering 排序字段,唯一的
- title 标题
- region 区域
- language 语言
- types 类型,可能出现多个但不仅有 "alternative", "dvd", "festival", "tv", "video", "working", "original", "imdbDisplay"
- attributes 属性
- isOriginalTitle 是否为原始标题
根据业务设计字段映射
由于我们是自主学习,并没有实际的业务去支撑,所以我们根据字段的实际含义来设计对应的业务需求,并采用对应的类型映射。
titleId & ordering
这里要注意的是,实际上这两个标识并不是唯一的。如果需要唯一,那就要把这两个组合在一起。
在根据实际业务开发过程中,一定要多看几眼,避免因为语言和文化差异导致的对需求的理解偏差。
title & region & language
这三个属于字符串类型的业务字段,要注意的是数据会以\N
作为没有数据的填充,这个不需要导入ES数据中。
types & attributes
这两个业务字段属于数组类型,业务上可能需要多选查询。
isOriginalTitle
布尔类型的值,业务上需要勾选是否。
确定ES映射
业务分析
根据上面的业务分析,我们可以得出如下结果
- titleId,模糊搜索
- ordering,精准匹配
- title,模糊搜索
- region,精准匹配
- language,精准匹配
- types,数组内元素的精准匹配
- attributes,数组内元素的精准匹配
- isOriginalTitle,精准匹配
同时,由于这些字段内并没有完全的唯一标识,我们把titleId和ordering进行拼接,得到一个系统内的唯一标识,并命名为id
确认映射
- id text
- titleId text
- ordering integer
- title text
- region keyword
- language keyword
- types array
- attributes array
- isOriginalTitle boolean
其中array内部存放string类型
声明映射
根据上一步分析,映射声明脚本如下
PUT imdb
{
"mappings": {
"properties": {
"id": { "type": "text" },
"titleId": { "type": "text" },
"ordering": { "type": "integer" },
"title": { "type": "text" },
"region": { "type": "keyword" },
"language": { "type": "keyword" },
"types": { "type": "keyword" },
"attributes": { "type": "keyword" },
"isOriginalTitle": { "type": "boolean" }
}
}
}
创建成功
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "imdb"
}
在索引管理中可以查看到刚才创建的映射
总结
- 根据实际业务设计映射
- 业务上的坑不少需要花时间理解透彻