干货 | Elasticsearch5.X Mapping万能模板

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/1 { "region": "US", "manager": { "age": 30, "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/1 { "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": 256, "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" } } } } } } }

4、小结

看到这里,有人可能不服气的说,哎,又是官网都有的资料!

突然想起另一个问题:

高考的时候的每一个得分点,课本上不都有吗?那为什么我们没有达到700分以上呢? 既然课本上都有,为什么还要那么多《黄冈XX冲刺》、《黄冈XX密卷》以及N多复习资料呢?

或许正如大神刘未鹏所说,“重要的事情要营造比较大的时间块来完成。比如读一本好书,或者掌握一个重要的知识点,最好不要切得太琐碎了看,否则看了后面忘了前面,不利于知识的组织和联系。”

我做的就是上面的工作。

以上,是说给自己的,也与大家共勉!

参考:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/mapping-types.html

原文发布于微信公众号 - 铭毅天下(gh_0475cf887cf7)

原文发表时间:2017-10-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端小栈

javaScript中is-not-defined,undefined和null的区别

之前没太注意is not defined和undefined有什么区别,每次都是简单的把两者理解为未定义,现在回过头来梳理js基础的时候才发现其中区别还是很鲜明...

832
来自专栏Taylor技术日志

关于char/varchar(n)中n的探究:字符数or字节数

很多时候我们不确定某个字段的长度,会使用varchar类型,比如某个字段定义为varchar(100),那这100的长度能存多少个中文?

4387
来自专栏Golang语言社区

用Golang写一个搜索引擎

本篇较长较枯燥,请保持耐心看完。 前面两章介绍了一下倒排索引以及倒排索引字典的两种存储结构,分别是 跳跃表 和 哈希表 ,本篇我们介绍另一种数据结构,他也被大量...

4497
来自专栏静晴轩

lua表排序

Lua作为一种很强大且轻量级脚本语言的存在,对于掌握其几乎无所不能的Table(其实就是一个Key Value的数据结构,它很像Javascript中的Obje...

43311
来自专栏北京马哥教育

AWK处理日志入门

前言 这两天自己挽起袖子处理日志,终于把AWK给入门了。其实AWK的基本使用,学起来也就半天的时间,之前总是靠同事代劳,惰性呀。 此文仅为菜鸟入门,运维们请勿...

3484
来自专栏用户2442861的专栏

初学Redis(3)——简单实现Redis缓存中的排序功能

http://blog.csdn.net/qtyl1988/article/details/39545531

601
来自专栏iOS 开发杂谈

iOS RunTime之五:Category 面试题

很多人在面试的时候都会被问到 Category,既然允许用 Category 给类增加方法和属性,那为什么不允许增加成员变量?

3544
来自专栏逍遥剑客的游戏开发

C++的反射和序列化

1472
来自专栏鸿的学习笔记

Python写的Python解释器(七)--完结篇

在程序运行时,只会创建一次VirtualMachine实例,这是因为只有一个Python解释器。 VirtualMachine存储着call stack,异常状...

1023
来自专栏大史住在大前端

野生前端的数据结构基础练习(2)——队列

循环队列书中并没有提及,它是一种特殊的队列。简单理解就是将基本队列只当做存储结构,而使用front和rear两个指针分别代表队列的头和尾,实际对外表现的队列是f...

2113

扫码关注云+社区

领取腾讯云代金券