【Elasticsearch入门】Elasticsearch映射

映射是定义存储和索引的文档类型以及字段的过程。一个映射定义了文档结构内每个字段的数据类型。映射通过配置来定义字段类型与该类型相关联的元数据的关系。例如,可以通过映射来定义日期类型的格式、数字类型的格式或者文档中所有字段的值是否应该被a字段索引等。

1、概念

1.1、映射类型

每个索引拥有一个或多个映射类型,用来在索引中将文档划分为不同的逻辑组。
每个映射类型拥有(在6.0.0中已被标记过期)

  • 元字段:用来定义如何处理文档的元数据。元字段包括文档的_index字段、_type字段、_id字段和_source字段。
  • 字段或属性:每个映射类型包含与类型相关的字段或属性列表。同一索引中不同映射类型的相同名称字段必须拥有相同的映射。

1.2、字段数据类型

每个字段拥有一个数据类型,可以是简单数据类型,比如文本(text)、关键字(keyword)、日期型(date)、长整型(long)、双精度浮点型(double)、布尔型(boolean)或者IP。
支持JSON的层次性类型,比如对象(object)、嵌套(nested),或者特定的类型,比如地理点(geo_point)、地理形状(geo_shape)、completion。

基于不同目的对同一个字段进行不同方式的索引是很有用的。例如,一个字符串类型字段可以在全文搜索中作为分析字段,在排序或聚合时作为不分析的字段。或者,可以通过标准分析器、英文分析器或者法语分析器对字符串字段进行索引。
一个数据类型通过 fields参数支持多字段。

1.3、动态映射

字段和映射类型在使用前不需要事先定义。依靠动态映射,通过索引文档,新的映射类型和字段名会自动添加。新的字段可以添加到顶级映射类型或者映射内部的对象和嵌入段
动态映射可以配置自定义映射用于新类型或者新字段。

1.4、显式映射

相对于 Elasticsearch来说,我们对于数据类型的掌控更加全面,所以我们可以指定显式映射而不是使用动态映射。
当创建索引的时候,可以创建映射类型和字段。也可以在当前的索引中通过映射创建接口添加映射类型和字段。

1.5、更新当前映射

除了记录之外,现有的映射类型和字段不能更新。修改映射意味着废弃已经索引的文档,我们反而应该根据映射创建新的索引并且重新索引数据。

1.6、映射类型之间共享字段

映射类型在每个索引中是唯一的,就是在一个索引的多个类型中,如果多个类型中的映射名称一样,则它必须是相同的类型。
例如:如果一个title字段同时存在于user和 blogpost映射类型中,title字段在每个类型中必须拥有相同的映射。这个规则的唯一例外是:对于 copy_to参数、dynamic参数、enabled参数、ignore_above参数, include_in_all参数,每个不同映射类型中的字段拥有不
同的参数设置。
通常,相同名称的字段由相同类型的数据构成,所以拥有相同的索引是没有问题的。当产生类型冲突的时候,可以选择更详细的命名,比如 user_title和 blog_title。

1.7、映射示例

当创建索引的时候,可以指定映射:

上面的接口表示创建一个名为 secisland的索引,在索引中添加名为user和 blogpost的映射类型。user映射类型取消元字段_all,指定了每个映射类型的字段或属性,指定了每个字段的数据类型和映射。

2、字段数据类型

Elasticsearch支持一系列不同的数据类型来定义文档字段,分为核心数据、复杂数据、地理数据、专门数据类型。

核心数据类型包括:

  • 字符串数据类型: string
  • 数字型数据类型: long、 Integer、 short、byte、 double、float
  • 日期型数据类型: date
  • 布尔型数据类型: boolean
  • 二进制数据类型: binary

复杂数据类型包括:

  • 数组数据类型: 不需要专门的类型来定义数组。
  • 对象数据类型: object,单独的JSON对象。
  • 嵌套数据类型: nested,关于JSON对象的数组。

地理数据类型包括:

  • 地理点数据类型: geo_point,经纬点。
  • 地理形状数据类型: geo_shape,多边形的复杂地理形状。

专门数据类型包括:

  • IPv4数据类型:IP协议为IPv4的地址。
  • 完成数据类型: completion,提供自动补全的建议。
  • 单词计数数据类型: token_count,统计字符串中的单词数量。

2.1、核心数据类型

2.1.1、字符串数据类型

字符串数据类型的字段接受文本值,可以分为如下两种:

  • 全文本:全文本值通常用于基于文本的相关性搜索,全文本字段可以分词,即在索引执行之前通过一个分词器将字符串转换为单词列表。分词操作使得 Elasticsearch可以在全文本字段上搜索单词。全文本字段不用于排序而且很少用于聚合。
  • 关键字:关键字是个精准值,通常用于过滤(例如,为 published的博客文章获取所有 status字段值)、排序、参与聚合。关键字字段不参与分词。

字符串数据类型的字段可以接受的参数如表3-1所示。

2.1.2、数字型数据类型

数字型数据类型支持的数字类型如表3-2所示。

2.1.3、日期型数据类型

JSON没有日期型数据类型,所以在 Elasticsearch中,日期可以是

  • 包含格式化日期的字符串,例如“2015-01-01”或者“2015/01/01 12:10:30”。
  • 代表时间毫秒数的长整型数字。
  • 代表时间秒数的整数。

通常,日期被转换为UTC(如果时区被指定)但是存储为代表时间毫秒数的长整数。
可以自定义时间格式,如果没有指定格式,则使用默认值:"strict_ date_optional_time || epoch_millis"
这意味着接受任意时间戳的日期值,例如:

(1)多日期格式
使用双竖线(||)分隔,可以指定多个日期格式。每个格式会被依次尝试,直到找到匹配的格式。第一个格式会用于将时间毫秒数值转换为字符串:

(2)日期型数字的字段参数
日期型数据的字段参数参见表3-4。

2.1.4、布尔数据类型

布尔型字段接受true或 false值,也可以接受代表真或假的字符串和数字:

  • 假值——false,"false","off","no","0”,""(空字符串),0,0.0。
  • 真值——其他任何非假的值。

索引词聚合之类的聚合使用1和0作为key,使用字符串“true”和“ false”作为key_as_string。使用脚本时,布尔字段返回1和0。布尔型字段参数见表3-5。

2.1.5、二进制数据类型

二进制数据类型接受Base64编码字符串的二进制值。字段不以默认方式存储而且不能搜索:

Base64编码二进制值不能嵌入换行符\n。二进制数据类型的字段参数如下所示:

  • doc_values——定义字段是否应该以列跨度的方式存储在磁盘上,以便用于排序、聚合或者脚本。接受true(默认)或 false参数。
  • store——决定字段值是否应该存储以及从 source字段分别获取。接受参数tue或false(默认)。

2.2、复杂数据类型

2.2.1、数组数据类型

在 Elasticsearch中,没有专门的数组类型。每个字段默认可以包含零个或更多的值,然而,数组中所有的值都必须是相同的数据类型。例如

  • 字符串数组:["one","two"]
  • 整数数组:[1,2]
  • 由数组组成的数组:[1,[2,3],等同于[1,2,3]
  • 对象数组:[{"name":"Mary","age":12},{"name":"John","age":10}]

注意无法对数组中的每一个对象进行单独的查询。

当动态添加字段的时候,数组中第一个元素的值决定了字段类型,随后的所有值必须是相同的数据类型或者可以强制转换为相同的数据类型。
Elasticsearch不支持混合数据类型的数组,比如:[10,"some string"]
数组可能包含null值,会被 null_value配置替换掉或者忽略掉。一个空数组囗被当作缺失字段——没有值的字段。

2.2.2、对象数据类型

JSON文档是天然分层的:文档可以包含内部对象。同样,内部对象也可以包含内部对象。

上面文档的映射结构为:

映射类型是一种对象类型,拥有参数字段, manager字段是一个内部对象字段, manager.name字段是 manager字段中的内部对象字段。可以明确地设置type字段为 object((默认值)。
对象数据类型的参数如下所示:

  • dynamic——定义新的参数是否应该动态加入到已经存在的对象中。接受true(默认),false和 strict。
  • enabled——赋值给对象字段的JsON值应该被解析和索引(true,默认)还是完全忽略(false)。
  • include_in_all——为对象内的所有属性设置 include in all值。对象本身不添加到_all字段。
  • properties——对象内的字段可以是任意数据类型,包括对象数据类型。新的属性可以添加到已存在的对象中。

2.2.3、嵌套数据类型

嵌套数据类型是对象数据类型一个专门的版本,用来使一组对象被单独地索引和查询。
(1)对象数组是如何摊平的
Lucene没有内部对象的概念,所以 Elasticsearch利用简单的列表存储字段名和值,将对象层次摊平。例如,下面的文档:

user. first和 user. last字段存在多值字段中, alice和 white的关联性丢失了。这个文档可能错误地匹配到关于 alice和 smith的查询。
(2)对一组对象使用嵌套字段
如果需要对一组对象进行索引而且保留数组中每个对象的独立性,可以使用嵌套数据类型而不是对象数据类型。本质上,嵌套对象将数组中的每个对象作为分离出来的隐藏文档进行索引。这也意味着每个嵌套对象可以独立于其他对象被查询,示例如下。
创建的映射如下所示

user字段作为嵌套类型添加到索引中。搜索1匹配不到结果,因为Aice和 Smith不在同一个嵌套对象中;搜索2匹配到搜索结果,因为Alc和 White在同一个嵌套对象中。
嵌套数据类型的字段参数如下所示:

  • dynamic——定义新的参数是否应该动态加入到已经存在的对象中。接受true(默认),false和 strict。
  • inclue_in_all——设置所有嵌套对象属性的 include in all值。嵌套文档没有它们自身的_a字段,取而代之的是,值被添加到“根”文档的a字段中。
  • properties——嵌套对象的字段可以是任何数据类型,包括嵌套对象类型。新的属性可以被添加到已经存在的嵌套对象中。

2.3、地理数据类型

2.3.1、地理点数据类型

地理点数据类型字段接受经纬度对,可用于:

  • 查找一定范围内的地理点,这个范围可以是相对于一个中心点的固定距离,也可以是多边形或者地理散列单元。
  • 通过地理位置或者相对于中心点的距离聚合文档。
  • 整合距离到文档的相关性评分中。
  • 通过距离对文档进行排序。

指定字段类型为地理位置数据类型:

存储地理位置数据有4种不同方式。下面分别介绍。

字符串地理点参数顺序为(纬度,经度),地理点数组参数的顺序为(经度,纬度)。地理点数据字段参数见表3-6。

2.3.2、地理形状数据类型

地理形状数据类型有利于索引和搜索任意地理形状,例如矩形和多边形。无论是数据被索引还是在查询执行的过程中,都可以使用地理形状数据类型在地理点的基础上包含地理形状。
利用地理形状查询(geo_shape)来查询文档,可以使用地理形状数据类型。
(1)映射选项
地理形状类型映射将 geo_json几何对象映射成地理形状类型。为了启用映射选项,需要明确映射字段为地理形状类型,参见表3-7。
(2)前缀树
在索引中高效地表示形状,形状被转换到一系列表示为方格(通常被称为“栅格”)的散列用于实现一个前缀树。树的概念来自该前缀树使用多层网格,每层增加精度级别来表示陆地。这可以提高地图的缩放级别或图像的细节水平。
(3)空间策略
前缀树的实现基于空间策略用来分解提供的形状为近似方格。每个策略解决这些问题

  • 哪种类型的形状可以被索引。
  • 形状可以用于哪种类型的查询操作。
  • 每个字段是否可以保存多个形状。

提供的这些策略实现(具有相应的功能)见表3-8。

(4)准确性
地理形状不提供100%的准确性,并且取决于匹配值,可能对确定的查询返回一些误判或漏判的结果。为了缓和这个问题,需要为tree_levels参数选择一个合适的值来适应相应的预期。
例如:

这个映射将 location字段映射到地理形状类型,使用quad前缀树并且精度为1m。Elasticsearch转换这个精度到 tree_levels设置为26。
(5)性能方面的考虑
Elasticsearch使用前缀树中的路径作为索引和查询中的索引词。更高级别的精确值,会生成更多的索引词。计算索引词、加载到内存、保存到磁盘也需要额外的性能花销。
索引大小和合理水平的精确值的折中是50m。
(6)输入结构
用于表示形状的 GeoJSON格式见表3-9:

下面举例说明这些格式。
Point是一个单独的地理坐标点,比如当前建筑的位置或者智能手机地理定位接口提供的确切位置。

Linestring通过两个或更多的一组位置定义。只指定两个点, Linestring会表示一条直线。指定更多的点,可以创建任意的线。

Polygon通过一列地理点列表进行定义。每个列表(外环)中的第一个点和最后一个点必须相同(多边形必须是封闭的)。

orientation参数可以在地理形状数据类型字段创建映射的时候进行定义,规定顶点的顺序。也可以在每个文档中进行重写。

(7)排序和取回形状索引
由于形状复杂的输入结构和索引表示,当前不能直接通过字段排序或取回形状。地理形状值只能通过 source字段取回。

2.4、专门数据类型

2.4.1、IPv4数据类型

IPv4字段本质上是一个长整型字段,接受IPv4地址并作为长整型值进行索引。

添加映射

插入数据

IPv4数据类型的字段参数见表3-10。

2.4.2、单词计数数据类型

单词计数型字段本质上是一个整数型字段,接受并分析字符串值,然后索引字符串中单词的个数。下面举例说明。

添加映射

严格来说,单词计数类型计算位置增量而不是统计单词。这意味着即使分析器过滤掉部分单词,它们也会被包含在计数中。单词计数类型的字段参数如表3-11所示。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值