ES映射的使用

映射是定义存储和索引的文档类型以及字段的过程。索引中的每一个文档都有一个类型,每种类型都有它自己的映射。一个映射定义了文档结构内每个字段的数据类型。映射通过配置来定义字段类型与该类型相关联的元数据的关系。例如,可以通过映射来定义日期类型的格式、数字类型的格式或者文档中所有字段的值是否应该被_all字段索引等。本章将介绍映射的概念、参数,以及动态映射的使用等。

概念

1.映射类型

每个索引拥有一个或多个映射类型,用来在索引中将文档划分为不同的逻辑组。

每个映射类型拥有:

□元字段:用来定义如何处理文档的元数据。元字段包括文档的_index字段、_type字段、_id字段和_source字段。

□字段或属性:每个映射类型包含与类型相关的字段或属性列表。同一索引中不同映射类型的相同名称字段必须拥有相同的映射。

2.字段数据类型

每个字段拥有一个数据类型,可以是简单数据类型,比如字符串型(String)、日期型(date)、长整型(long)、双精度浮点型(double)、布尔型(boolean)或者IP。

支持JSON的层次性类型,比如对象(object)、嵌套(nested),或者特定的类型,比如地理点(geo_point)、地理形状(geo_shape)。

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

一个数据类型通过fields参数支持多字段。

3.动态映射

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

动态映射可以配置自定义映射用于新类型或者新字段。

4.显式映射

相对于Elasticsearch来说,我们对于数据类型的掌控更加全面,所以我们可以指定显式映射而不是使用动态映射。

当创建索引的时候,可以创建映射类型和字段。也可以在当前的索引中通过映射创建接口添加映射类型和字段。

5.更新当前

映射除了记录之外,现有的映射类型和字段不能更新。

修改映射意味着废弃已经索引的文档,我们反而应该根据映射创建新的索引并且重新索引数据。

字段数据类型

1. 核心数据类型

(1)字符串类型: text, keyword

□全文本。全文本值通常用于基于文本的相关性搜索,全文本字段可以分词,即在索引执行之前通过一个分词器将字符串转换为单词列表。分词操作使得Elasticsearch可以在全文本字段上搜索单词。全文本字段不用于排序而且很少用于聚合。

□关键字。关键字是个精准值,通常用于过滤(例如,为published的博客文章获取所有status字段值)、排序、参与聚合。关键字字段不参与分词

(2)数字类型:longintegershortbytedoublefloathalf_floatscaled_float

(3)日期:date

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

□包含格式化日期的字符串,例如“2015-01-01”或者“2015/01/0112:10:30”。

□代表时间毫秒数的长整型数字。

□代表时间秒数的整数。

通常,日期被转换为UTC(如果时区被指定)但是存储为代表时间毫秒数的长整数。

可以自定义时间格式,如果没有指定格式,则使用默认值:

这意味着接受任意时间戳的日期值

(4)布尔型:boolean

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

□假值——false,“false”,“off”,“no”,“0”,“”(空字符串),0,0.0。

□真值——其他任何非假的值。

(5)Binary:binary

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

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

□doc_values——定义字段是否应该以列跨度的方式存储在磁盘上,以便用于排序、聚合或者脚本。接受true(默认)或false参数。

□store——决定字段值是否应该存储以及从_source字段分别获取。接受参数true或false(默认)。

(6)Range: integer_rangefloat_rangelong_rangedouble_rangedate_range

2. 复杂数据类型

数组数据类型

在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配置替换掉或者忽略掉。一个空数组[]被当作缺失字段——没有值的字段。

Object: object(for single JSON objects) 对象数据类型

文档可以包含内部对象。同样,内部对象也可以包含内部对象。

需要注意的是,object类型的字段,也可以有多个值,形成List<object>的数据结构。

Nested: nested (for arrays of JSON objects) 嵌套数据类型

嵌套数据类型是对象数据类型一个专门的版本,用来使一组对象被单独地索引和查询。

需要建立对象数组的索引并保持数组中每个对象的独立性,则应使用nested数据类型而不是 object数据类型。在内部,嵌套对象索引阵列作为一个单独的隐藏文档中的每个对象,这意味着每个嵌套的对象可以被独立的查询。

3. 地理数据类型

(1)Geo-point: geo_point (for lat/lon points)

(2)Geo-shape: geo_shape (for complex shapes like polygons)

4. 特殊数据类型

(1)IP:  ip (IPv4 和 IPv6 地址)

(2)Completion类型:completion (to provide auto-complete suggestions)

(3)Token count:token_count (to count the number of tokens in a string)

(4)mapper-murmur3:murmur3(to compute hashes of values at index-time and store them in the index)

(5)mapper-annotated-text:annotated-text (to index text containing special markup (typically used for identifying named entities))

(6)Percolator:(Accepts queries from the query-dsl)

(7)Join:(Defines parent/child relation for documents within the same index)

(8)Alias:(Defines an alias to an existing field.)

(9)Rank feature:(Record numeric feature to boost hits at query time.)

(10)Rank features:(Record numeric features to boost hits at query time.)

(11)Dense vector:(Record dense vectors of float values.)

(12)Sparse vector:(Record sparse vectors of float values.)

(13)Search-as-you-type:(A text-like field optimized for queries to implement as-you-type completion)

5.数组类型

        在Elasticsearch中,数组不需要一个特定的数据类型,任何字段都默认可以包含一个或多个值,当然,这多个值都必须是字段指定的数据类型。

6.Multi-fields

        Multi-fields 通常用来以不同的方式或目的索引同一个字段。比如,一个字符串类型字段可以同时被映射为 text 类型以用于全文检索、 keyword字段用于排序或聚合。又或者,你可以用standard分析器、english分析器和french分析器来索引同一个 text字段。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值