映射是定义一个文档以及其所包含的字段如何被存储和索引的方法。
例如,用映射来定义以下内容:
每个索引都有一个或多个映射类型(mapping type)来对索引内的文档进行逻辑分组(mapping type 就是平常所说的 type)。
每一个映射类型都包含以下内容:
1. 元数据字段
元数据字段用来自定义如何处理关联文档的元数据。元数据字段包括: _index, _type, _id, _source.
2. 字段列表或属性
每个映射类型都包含一个字段列表或者是和该类型相关的一些属性。
每一个字段,都属于一种数据类型。
1. 基本数据类型
string, long, boolean, ip
2. JSON 分层数据类型
object, nested
3. 特殊类型
geo_point, geo_shape, completion
字段及其映射类型不必在使用前事先定义好,这得益于动态映射的应用。
动态映射能够根据文档索引过程来自动生成映射类型和字段名。
动态映射规则可以用来定义新类型和新字段的映射。
如果你比 ES 通过猜测来确定映射更加了解你的数据,那么定义一个动态映射将会很有用。不过有时候你可能需要指定自己的显式映射。
显式映射可以在创建索引时候定义,或者用 mapping API 来为已有的索引添加映射类型或字段。
映射支持更新,如果需要,必须重建索引并设置正确的 mapping ,而不是试图去更新已有的 mapping。
映射类型用来逻辑分组字段,但是每个映射类型之间的字段并非独立存在的。
1. 规则:
字段在以下条件:
的时候其实是映射到内部相同的字段上,所以,必须拥有相同的映射设置。
2. 例外:
有一些例外,参数:
可以对满足前述“规则”的字段进行各自不同的设置。
字符串类型被分为两种情况:full-text 和 keywords。
full-text 表示字段内容会被分析,而 keywords 表示字段值只能作为一个精确值查询。
参数:
analyzer
、boost
、doc_values
、fielddata
、fields
、ignore_above
、include_in_all
、index
、index_options
、norms
、null_value
、position_increment_gap
、store
、search_analyzer
、search_quote_analyzer
、similarity
、term_vector
数值类型包括: long, integer, short, byte, double, float 。
参数:
coerce
、boost
、doc_values
、ignore_malformed
、include_in_all
、index
、null_value
、precision_step
、store
JSON 本身并没有日期数据类型,在 ES 中的日期类型可以是:
"2015-01-01"
or "2015/01/01 12:10:30" 的字符串
long 类型的毫秒级别的时间戳
int 类型的秒级别的时间戳
日期类型默认会被转换为 UTC 并且转换为毫秒级别的时间戳的 long 类型存储。
日期类型如果不指定 format ,将会以默认格式表示。
参数:
boost
、doc_values
、format
、ignore_malformed
、include_in_all
、index
、null_value
、precision_step
、store
布尔假: false
, "false"
, "off"
, "no"
, "0"
, ""
(empty string), 0
, 0.0 。
布尔真: 任何不为假的值。
像 terms aggregation 聚合,是使用 1 和 0 来作为 key 的,key_as_string 则是用字符串 true 和 false
布尔类型的值,在 scripts 中则始终返回 1 或 0
参数:
boost
、doc_values
、index
、null_value
、store
二进制类型以 Base64 编码方式接收一个二进制值,二进制类型字段默认不存储,也不可搜索。
参数:doc_values
、store
JSON 格式本身是分层级的——文档可以包含对象,对象还可以包含子对象。不过,在 ES 内部 "对象" 被索引为一个扁平的键值对。
例如:
PUT my_index/my_type/1
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
转换为:
{
"region": "US",
"manager.age": 30,
"manager.name.first": "John",
"manager.name.last": "Smith" //层级结构被以 "." 来表示。
}
数组类型,要求数组元素的数据类型必须一致。
"one"
, "two"
]1
, 2
]1
, [ 2
, 3
]] which is the equivalent of [ 1
, 2
, 3
]{ "name": "Mary", "age": 12 }
, { "name": "John", "age": 10 }
] 数组元素的数据类型,将会由其第一个元素的数据类型决定。
对象数组,在 ES 内部将会被转换为 "多值" 的扁平数据类型。后面将会详解这一点。
例如:
PUT my_index/my_type/1
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
转转为:
{
"group" : "fans",
"user.first" : [ "alice", "john" ],
"user.last" : [ "smith", "white" ]
}
对象数组在 ES 内部,会把所有数组元素(即对象)合并,对象中的每一个字段被索引为一个 "多值" 字段。
这将导致每个数组元素(对象)内部的字段关联性丢失,解决的方法是使用 nested 类型。
例如:
PUT my_index/my_type/1
{
"region": "US",
"manager": {
"age": 30,
"name": [
{
"first": "John",
"last": "Smith"
},
{
"first": "Bob",
"last": "Leo"
}
]
}
}
转换为:
{
"region": "US",
"manager.age": 30,
"manager.name.first": "John Bob",
"manager.name.last": "Smith Leo"
}
// 如果我们搜索:
"bool": {
"must": [
{ "match": { "manager.name.first": "John" }}, // John Smith
{ "match": { "manager.name.last": "Leo"}} // Bob Leo
]
}
//这将会导致导致文档被命中,显然,John Smith 、Bob Leo 两组字段它们内在的关联性都丢失了
参数:
dynamic
、enabled
、include_in_all
、properties
嵌套类型是一个特殊对象类型,嵌套类型允许对对象数组的每一个元素(对象)相互独立的进行查询,也即他们不会被合并为一个对象。
嵌套类型的文档可以:
nested
查询来查询nested
来分析以及 reverse_nested
来聚合例如:
PUT my_index/my_type/1
{
"region": "US",
"manager": {
"age": 30,
"name": [
{
"first": "John",
"last": "Smith"
},
{
"first": "Bob",
"last": "Leo"
}
]
}
}
转换为:
{
"region": "US",
"manager.age": 30,
{
"manager.name.first": "John",
"manager.name.last": "Smith"
},
{
"manager.name.first": "Bob",
"manager.name.last": "Leo"
}
}
// 如果我们搜索:
"bool": {
"must": [
{ "match": { "manager.name.first": "John" }}, // John Smith
{ "match": { "manager.name.last": "Leo"}} // Bob Leo
]
}
//这样的查询将不能命中文档!!!
参数:
dynamic
、include_in_all
、properties
IPV4 数据类型其实质是个 long 类型,不过其能接收一个 IPV4 地址并且将他转换为 long 类型存放。
参数:
boost
、doc_values
、include_in_all
、index
、null_value
、precision_step
、store
GET index_1,index_2/_search
{
"query": {
"terms": {
"_index": ["index_1", "index_2"]
}
},
"aggs": {
"indices": {
"terms": {
"field": "_index",
"size": 10
}
}
},
"sort": [
{
"_index": {
"order": "asc"
}
}
],
"script_fields": {
"index_name": {
"script": "doc['_index']"
}
}
}
GET my_index/_search/type_*
{
"query": {
"terms": {
"_type": [ "type_1", "type_2" ]
}
},
"aggs": {
"types": {
"terms": {
"field": "_type",
"size": 10
}
}
},
"sort": [
{
"_type": {
"order": "desc"
}
}
],
"script_fields": {
"type": {
"script": "doc['_type']"
}
}
}
字段说明
禁用_source字段
PUT tweets
{
"mappings": {
"tweet": {
"_source": {
"enabled": false
}
}
}
}
_source排除特定字段
PUT logs
{
"mappings": {
"event": {
"_source": {
"includes": [
"*.count",
"meta.*"
],
"excludes": [
"meta.description",
"meta.other.*"
]
}
}
}
}
字段说明
GET my_index/_search
{
"query": {
"match": {
"_all": "john smith 1970"
}
}
}
_all字段查询
GET _search
{
"query": {
"query_string": {
"query": "john smith 1970"
}
}
}
禁用_all字段
PUT my_index
{
"mappings": {
"my_type": {
"_all": {
"enabled": false
},
"properties": {
"content": {
"type": "string"
}
}
}
},
"settings": {
"index.query.default_field": "content"
},
}
_all排除特定字段
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"date": {
"type": "date",
"include_in_all": false
}
}
}
}
}
_all字段存储
PUT myindex
{
"mappings": {
"mytype": {
"_all": {
"store": true
}
}
}
}
字段说明
exists
和 missing
查询使用,来查询某个文档中是否包含或不包含某个字段。
GET my_index/_search
{
"query": {
"terms": {
"_field_names": [ "title" ]
}
},
"aggs": {
"Field names": {
"terms": {
"field": "_field_names",
"size": 10
}
}
},
"script_fields": {
"Field names": {
"script": "doc['_field_names']"
}
}
}
字段说明
PUT my_index
{
"mappings": {
"my_parent": {},
"my_child": {
"_parent": {
"type": "my_parent"
}
}
}
}
GET my_index/_search
{
"query": {
"terms": {
"_routing": [ "user1" ]
}
},
"aggs": {
"Routing values": {
"terms": {
"field": "_routing",
"size": 10
}
}
},
"sort": [
{
"_routing": {
"order": "desc"
}
}
],
"script_fields": {
"Routing value": {
"script": "doc['_routing']"
}
}
}
映射设置一般发生在:
1. 增加新的 index 的时候,添加 mapping type,对 fields 的映射进行设置
PUT twitter
{
"mappings": {
"tweet": {
"properties": {
"message": {
"type": "string"
}
}
}
}
}
2. 为 index 增加新的 mapping type,对 fields 的映射进行设置
PUT twitter/_mapping/user
{
"properties": {
"name": {
"type": "string"
}
}
}
3. 为已有 mapping type 增加新的 fields 映射设置
PUT twitter/_mapping/tweet
{
"properties": {
"user_name": {
"type": "string"
}
}
}
1. 在 PUT 请求体中给出完整的 mapping 设置
PUT twitter
{
"mappings": { //mappings 对象,说明进行 mapping 设置
"tweet": { //指定 mapping type
"properties": { //指定 mapping type 的 properties 设置
"message": { //对字段 message 的映射进行设置
"type": "string" //mapping 参数配置
}
}
}
}
}
增加 index 的时候,除了可以设置 mapping type,还可以对 index 进行设置,比如配置自定义 analyzer、索引分片个数设置等
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"my_type": {
"properties": {
"text": {
"type": "string",
"analyzer": "autocomplete"
}
}
}
}
}
2. 在 PUT 请求 URI 中指定 type,并在请求体中给出 type 的各项设置
PUT twitter/_mapping/user
{
"properties": { //指定 mapping type 的 properties 设置
"name": { //对字段 message 的映射进行设置
"type": "string" //mapping 参数配置
}
}
}
3. 一个完整的 mapping type 设置包括:Meta-fields 和 Fields 或者 properties 设置
PUT my_index
{
"mappings": {
"type_1": {
"properties": {...} //properties 设置
},
"type_2": {
"_all": { //meta-fields 设置
"enabled": false
},
"properties": {...}
}
}
}
在使用 ES 的时,我们不需要事先定义好映射设置就可以直接向索引中导入文档。ES 可以自动实现每个字段的类型检测,并进行 mapping 设置,这个过程就叫动态映射(dynamic mapping)。
动态映射可以通过以下设置来关闭。
PUT /_settings
{
"index.mapper.dynamic":false
}
动态映射的规则也可以自定义,有以下几种我们可以自定义规则的应用场景:
其中,前 3 个条件中都是针对特定 index 下的 type 进行设置,而条件 4 是针对所有满足条件的 index 进行设置。
默认映射通过把 mapping type 设置为 _default_ 来定义。
默认映射将会应用到该 index 下的任意新增 type 中。
默认映射可以在添加 index 时候设置,也可以创建 index 之后再通过 PUT mapping 接口进行设置。
PUT my_index
{
"mappings": {
"_default_": {
"_all": {
"enabled": false //默认映射禁用掉所有新增 type 的 _all 元数据字段
}
},
"user": {},
"blogpost": {
"_all": {
"enabled": true //覆盖 _default_ 的设置,启用 _all 字段
}
}
}
}
默认情况,发现新的字段,ES 自动检测其 datatype 并将其加入到 mapping type 中。
通过一些设置,我们可以控制字段动态映射的方式,包括:日期类型检测、数值类型检测、自定义日期类型的格式等。
PUT my_index //禁用日期类型检测
{
"mappings": {
"my_type": {
"date_detection": false
}
}
}
PUT my_index //自定义日期类型的格式
{
"mappings": {
"my_type": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
}
PUT my_index //启用数值类型检测
{
"mappings": {
"my_type": {
"numeric_detection": true
}
}
}
动态模板将会根据条件判断,应用到满足条件的新增字段上去。
应用条件包括:
动态模板以数组的形式给出,数组的每一个元素就是一个模板。每个模板都有各自的应用条件,一旦新增的字段满足某个模板,模板内容就会应用到该字段上。
有两个特殊的变量,在模板中可以运用:{name}、{dynamic_type}。前者表示原字段的字段名,后者标识原字段被 ES 自动识别出来的数据类型。
"dynamic_templates": [ //数组,每个元素都是一个动态模板
{
"my_template_name": { //动态模板名称
... match conditions ... //应用条件判断
"mapping": { ... } //映射设置
}
},
... //多个数组元素标识多个动态模板
]
PUT my_index
{
"mappings": {
"my_type": {
"dynamic_templates": [
{
"named_analyzers": {
"match_mapping_type": "string",
"match": "*",
"mapping": {
"type": "string",
"analyzer": "{name}"
}
}
},
{
"no_doc_values": {
"match_mapping_type":"*",
"mapping": {
"type": "{dynamic_type}",
"doc_values": false
}
}
}
]
}
}
}
索引模板根据条件来判断新建的索引(只应用到新建索引上)是否满足某条件,并对其进行映射设置。
索引模板包含一些对索引的设置和映射设置。
在索引模板中有一个特殊变量可以运用:{index}。表示匹配上条件的原索引名称。
PUT /_template/template_1
{
"template": "te*", //判断条件,判断哪些索引将应用该模板
"settings": { //索引设置
"number_of_shards": 1
},
"mappings": { //映射设置
"type1": {
"_source": {
"enabled": false
},
"properties": {
"host_name": {
"type": "string",
"index": "not_analyzed"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z YYYY"
}
}
}
}
}
参照:https://www.cnblogs.com/licongyu/category/819588.html
更多请参照:
http://blog.csdn.net/napoay