0、引言

在关系型数据库如Mysql中,设计库表需要注意的是: 
1)需要几个表; 
2)每个表有哪些字段; 
3)表的主键及外键的设定——便于有效关联。 
表的设计遵守范式约束,考虑表的可扩展性,避免开发后期对表做大的改动。 
Mysql或者Oracle中,修改数据类型相对比较简单,通过命令行或者navicat、sqldeveloper等可视化工具直接修改。 
即便千万级别数据量,多等点时间,也能修改好。

而在Elasticsearch非关系型数据存储的搜索引擎中,设计表对应的就是Mapping的设计。 
且ES中一旦字段设定后,不能修改。 
当然,这也不是绝对的,可以通过新建索引,然后reindex将原有数据迁移到新索引。 
即便如此,还是建议:索引设计的前期,根据项目的需要设计好字段。如考虑如下的因素? 
1)字段的大小,考虑最大、最小的情况,如某一个字段超过1MB甚至更多; 
2)字段需不需要分词、全文检索、其他类型的检索; 
3)时间字段类型的设置,时间戳、UTC类型或者字符串类型; 
4) 字段需不需要聚合 
…….

这就引申出本文的内容,Elasticearch到底支持哪些数据类型?Elasticsearch如何进行数据选型? 
有没有直接拿来就用的Mapping万能模板。

1、Elasticsearch数据类型有哪些?一图胜千言

2、Elasticsearch数据如何选型?

2.1 字符串类型选型

text类型作用:分词,将大段的文字根据分词器切分成独立的词或者词组,以便全文检索。 
适用:email内容、某产品的描述等需要分词全文检索的字段; 
不适用:排序或聚合(Significant Terms 聚合例外)

keyword类型:无需分词、整段完整精确匹配。 
适用于:email地址、住址、状态码、分类tags。

2.2 数值类型选型

long长整型:一个带符号的64位整数,最小值为 -263 ,最大值为 263 -1。 
integer 整数:一个带符号的32位整数,最小值为 -231 ,最大值为 231 -1。 
short 短整形:一个带符号的16位整数,最小值为-32,768,最大值为32,767。 
byte 字节型:一个带符号的8位整数,最小值为-128,最大值为127。 
double 双精度浮点型:双精度64位IEEE 754浮点数。 
float 单精度浮点型:单精度32位IEEE 754浮点数。 
half_float半精度浮点型:半精度16位IEEE 754浮点数。 
scaled_float:由长度固定的缩放因子支持的浮点数。 
以上,根据长度选型即可。

2.3 日期类型选型

{ “date”: “2015-01-01” } 
{ “date”: “2015-01-01T12:10:30Z” } 
{ “date”: 1420070400001 } 
如上,日期类型或者时间戳类型。

参考模板: 
“date”: { 
“type”: “date”, 
“format”: “yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis” 
}

2.4 布尔类型选型

布尔字段接受JSON true和false值,但也可以接受被解释为true或false的字符串和数字: 
false值举例: 
false,“false”,“off”,“no”,“0”,“”(空字符串),0,0.0 
true值举例: 
以上false示例的反面,一切非假值。

2.5 二进制类型选型

二进制类型接受二进制值作为Base64编码字符串。 该字段默认情况下不存储,不可搜索: 
如: “blob”: “U29tZSBiaW5hcnkgYmxvYg==”

2.6 范围类型选型

integer_range :整型范围类型; 
float_range :单精度浮点范围类型; 
long_range :长整型范围类型; 
double_range :双精度范围类型; 
date_range :时间范围类型; 
ip_range :IP范围类型。 
以上,根据类型&范围需要选型即可。

2.7 数组类型选型

2.7.1 Array数组类型选型

在Elasticsearch中,没有专门的数组类型。 
默认情况下,任何字段都可以包含零个或多个值,但是数组中的所有值必须是相同的数据类型。 例如: 
字符串数组: [ “one”, “two” 
整数数组:[1,2] 
阵列数组:[1,[2,3]],相当于[1,2,3] 
一系列对象数组:[{“name”:“Mary”,“age”:12},{“name”:“John”,“age”:10}] 
可以理解为单类型扩展多个值的类型。 
如果需要根据数组值进行查询操作,官网建议使用nested嵌套类型。

数组类型:没有明显的字段类型设置,任何一个字段的值,都可以被添加0个到多个,当类型一直含有多个值存储到ES中会自动转化成数组类型 
对于数组类型的数据,是一个数组元素做一个数据单元,如果是分词的话也只是会依一个数组元素作为词源进行分词,不会是所有的数组元素整合到一起。 
在查询的时候如果数组里面的元素有一个能够命中那么将视为命中,被召回。

2.7.2 Object对象类型

JSON文档本质上是分层的: 存储类似json具有层级的数据,文档可能包含内部对象,而内部对象又可能包含其他内部对象。

PUT my_index/my_type/
{
"region": "US",
"manager": {
"age": ,
"name": {
"first": "John",
"last": "Smith"
}
}
}

这和Json类型的初衷是一致的。 
访问方式举例: “manager.name.last”: “Smith”。

2.7.3 nested嵌套类型

nested 嵌套类型是Object数据类型的特定版本,允许对象数组彼此独立地进行索引和查询。 
一个例子,自然就明白了:

PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"user": {
"type": "nested"
}
}
}
}
} PUT my_index/my_type/
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
} GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Alice" }},
{ "match": { "user.last": "Smith" }}
]
}
}
}
}
}

能完成嵌套查询&检索,对于非一对一关系的字段适用。

在ElasticSearch内部,嵌套的文档(Nested Documents)被索引为很多独立的隐藏文档(separate documents),这些隐藏文档只能通过嵌套查询(Nested Query)访问。每一个嵌套的文档都是嵌套字段(文档数组)的一个元素。 
嵌套文档的内部字段之间的关联被ElasticSearch引擎保留,而嵌套文档之间是相互独立的。 
默认情况下,每个索引最多创建50个嵌套文档,可以通过索引设置选项:index.mapping.nested_fields.limit 修改默认的限制。

2.8 IP类型

存储IPV4或IPV6地址。 
如: “ip_addr”: “192.168.1.1”

2.9 completion suggester类型

suggester类型对应 suggester检索,完成自动补全。

2.10 令牌计数类型

类型为token_count的字段实际上是一个接受字符串值的整数字段,对它们进行分析,然后对字符串中的令牌数进行索引。

……..

3、Elasticsearch万能Mapping模板。

以下模板,已验证好用,笔者在实际生产环境下就是这样使用的:

PUT testinfo_index
{
"mappings": {
"testinfo_type": {
"properties": {
"id": {
"type": "long"
},
"title": {
"type": "keyword"
},
"content": {
"analyzer": "ik_max_word",
"type": "text",
"fields": {
"keyword": {
"ignore_above": ,
"type": "keyword"
},
"available": {
"type": "boolean"
},
"review": {
"type": "nested",
"properties": {
"nickname": {
"type": "text"
},
"text": {
"type": "text"
},
"stars": {
"type": "integer"
}
}
},
"publish_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"expected_attendees": {
"type": "integer_range"
},
"ip_addr": {
"type": "ip"
},
"suggest": {
"type": "completion"
}
}
}
}
}
}
}

  以上是笔者结合官网以及自己实践过程中的一些总结,希望对各位有帮助:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/mapping-types.html

Elasticsearch5.X Mapping详解的更多相关文章

  1. mapping 详解2(field datatypes)

    基本类型 1. 字符串 字符串类型被分为两种情况:full-text 和 keywords. full-text 表示字段内容会被分析,而 keywords 表示字段值只能作为一个精确值查询. 参数: ...

  2. Elastic Stack 笔记(六)Elasticsearch5.6 搜索详解

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 主要包含索引过程和搜索过程. 索引过程:一条文档被索引到 Elasticsearch 之后,默认情况下 ES ...

  3. mapping 详解5(dynamic mapping)

    概述 在使用 ES 的时,我们不需要事先定义好映射设置就可以直接向索引中导入文档.ES 可以自动实现每个字段的类型检测,并进行 mapping 设置,这个过程就叫动态映射(dynamic mappin ...

  4. mapping 详解4(mapping setting)

    mapping type 映射设置一般发生在: 1. 增加新的 index 的时候,添加 mapping type,对 fields 的映射进行设置 PUT twitter { "mappi ...

  5. mapping 详解3(Meta-Fields)

    文档标识相关元数据字段 _index 当执行多索引查询时,可能需要添加特定的一些与文档有关联的索引的子句. _index 字段可以用在 term.terms 查询,聚合(aggregations)操作 ...

  6. mapping 详解1(mapping type)

    映射(mapping) 映射是定义一个文档以及其所包含的字段如何被存储和索引的方法. 例如,用映射来定义以下内容: 哪些 string 类型的 field 应当被当成当成 full-text 字段 哪 ...

  7. ELK&ElasticSearch5.1基础概念及配置文件详解【转】

    1. 配置文件 elasticsearch/elasticsearch.yml 主配置文件 elasticsearch/jvm.options jvm参数配置文件 elasticsearch/log4 ...

  8. centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解

    centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解 环境准备: 操作系统:centos ...

  9. c#操作ElasticSearch5详解

    c#操作ElasticSearch详解 ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearc ...

随机推荐

  1. 在ios开发中使用 try 和 catch 来捕获错误。

    本文转载至 http://blog.csdn.net/remote_roamer/article/details/7105776 抛出错误的代码 //如果返回的报文是错误信息,则抛出错误 if([ou ...

  2. Tensorlayer

    http://tensorlayer.readthedocs.io/en/latest/

  3. 【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree

    [BZOJ4605]崂山白花蛇草水 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了 ...

  4. Grunt学习笔记【5】---- expand使用方法

    本文主要讲expand使用方法. 当你希望处理大量的单个文件时,这里有一些附加的属性可以用来动态的构建一个文件列表.这些属性都可以用于 Compact 和 Files Array 文件映射格式. ex ...

  5. Activity设置style透明后与SurfaceView合用引发的无形命案

    近期搞视频通话,SurfaceView是不可缺少的,因为启动视频要载入一些资源,比較耗时.会有1.2s黑屏的现象,为了改善用户体验,我们须要设置Activity的Theme为透明风格(QQ 也是如此) ...

  6. CF A. DZY Loves Hash

    A. DZY Loves Hash time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  7. Bootstrap——全局CSS样式

    1.栅格系统 containter:用于固定宽度并支持响应式布局的容器 container-fluid:用于100%宽度,占据全部视口(viewport)的容器 row:行,必须在container或 ...

  8. 序列化组件(get/put/delete接口设计),视图优化组件

    一 . 知识点回顾 1 . 混入类 , 多继承 class Animal(object): def eat(self): print("Eat") def walk(self): ...

  9. IO多路复用之Reactor模式

    首先,我们来看看同步和异步. 在处理 IO 的时候,阻塞和非阻塞都是同步 IO.只有使用了特殊的 API 才是异步 IO. 接下来,我们来看看Linux下的三大同步IO多路复用函数 fcntl(fd, ...

  10. html5 手写的canvas实现

    试用支持canvas的浏览器,无JS依赖,运用新的HTML5技术DrawBoard.renderDrawer('myHandWrite',{  penColor:'#FF0000',  penWidt ...