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. Software-defined networking

    Software-defined networking administrators to programmatically initialize, control, change, and mana ...

  2. 使用maven3 创建自定义的archetype

    创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...

  3. 线程池ThreadPoolExcecutor介绍

    线程池ThreadPoolExecutor 使用Executors和ThreadPoolExecutor 并发新特性—Executor 框架与线程池

  4. CountDownLatch,CyclicBarrier,Semaphore的使用

    什么时候使用CountDownLatch CountDownLatch原理和示例 Semaphore信号量的原理和示例 CyclicBarrier的用法 CyclicBarrier 和 CountDo ...

  5. Java for LeetCode 134 Gas Station

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  6. Java for LeetCode 102 Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  7. BZOJ1833 数位DP

    数位DP随便搞搞. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstrin ...

  8. ping: sendto: Network is unreachable【转】

    本文转载自:http://blog.sina.com.cn/s/blog_640531380102wmzb.html 在我的板子上ping路由上的IP的时候可以ping通,但是ping外网的IP的时候 ...

  9. datax 添加oraclewriter

    日期格式: <param key="dtfmt" value="yyyy-MM-dd hh24:mi:ss"/>

  10. curl的安装与使用

    linux 下的curl扩展安装,记录一下(发现网上好多抄袭的也不检测一下能不能用) 1.下载curl安装包: https://curl.haxx.se/download.html 2.解压: 如 t ...