12.0 结构(Mapping)

来源:互联网 发布:程序员相亲被骗 编辑:程序博客网 时间:2024/05/02 04:22

结构(Mapping) 原文链接  翻译:AbnerGong

mapping的意思是制图、图谱,在这里相当于索引里的结构图,有时简称为结构。请注意,索引、索引的类型、索引类型的字段都有其结构(mapping)。

绘结构图(Mapping)是一个定义一个文档和它包含的域将会如何被存储和索引的过程。例如,使用结构图来定义:
- 哪个string差人应该当做full text字段来处理
- 哪个域包含数字,日期或地理位置
- 是否文档中的所有域的值应该索引到_all域中.
- 日期值的格式
- 自定义规则来控制动态添加的域(dynamically added fields)的结构图

结构类型(Mapping Types)

每个索引有一个或多个结构类型(mapping types),它们用来将索引中的文档分成几个逻辑组。用户文档可能会存储在一个user类型中,而博客可能会提交(post)到blogpost类型中。

每个结构类型有:
元字段(Meta-fields):元字段用来自定义与文档相关的元数据字段将会如何被处理(即除了你手动添加的字段,文档中还保留了一些默认字段 ——译者注 )。元字段包括文档的_index_type_id,和_source等字段。
(meta:译为”元”,本意是”在外部的”或”about”,比如元数据是描述其它数据的数据,元语言是描述其它语言的语言,元文件是包含其他文件的文件。这里的元字段是存储元数据的字段,即存储与文档数据相关的数据的字段。分为身份元字段,文档源元字段,索引元字段,路径元字段,其它元字段。——译者注)
字段或属性:每个结构类型包含一个与这个类型相关的字段列表或属性(properties)列表一个user类型可能包含title,nameage域,而一个blogpost类型可能包含title,body,user_idcreated字段。请注意:相同索引内的不同类型的同名字段必须有相同的结构(mapping)

字段数据类型

每个字段都包含一个数据类型(type),它可以是:
- 简单的类型像string,date,long,double,booleanip
- 支持分级天性的JSON类型,比如objectnested
- 或特别类型比如geo_point,geo_shapecompletion

它常常用于索引相同字段,用不同方式,为了不同的目的。例如,一个string字段可能被索引indexed作为一个分词字段为了全文搜索,并且作为一个不分词字段为了排序或分组。另外,你可能索引一个字符串字段用标准分词器,english分词器,或french分词器。

这是多字段的目的。大部分数据类型支持多字段通过fields参数。

动态结构(Dynamic mapping)

字段和结构类型不需要在使用前定义。多亏了动态结构,新的结构类型和新的结构名就会被自动添加,在索引一个文档的时候。新的字段可以同时被添加到顶级结构类型,以及内部objectnested字段。

动态结构规则可以配置来自定义用作新类型和新域的结构

明确的结构(Explicit mappings)

你对数据的了解比Elasticsearch猜到的更多,所以虽然动态映射在入门时很有用,但是在某些时候你会想指定自己的数据结构。
你可以在创建索引的时候创建结构类型和字段结构并且你也能用添加结构API向已经存在的索引中添加字段

更新已存在的结构(Updating existing mappings)

除了文档可以更新外,已经存在的类型和域类型都是不能更新的。改变结构以为了废弃已经索引的文档。取而代之的是,你应该用正确的结构创建新的索引并且重新索引你的数据到那个索引中。

跨结构类型分享的字段(Fields are shared across mapping types)

结构类型用来给字段分组,但是每个结构类型的字段不是相互独立的。字段拥有:
- 相同的名称
- 在相同的索引内
- 在不同的结构类型中
- 内部映射到相同的字段
- 必须有相同的结构

如果一个title字段同时存在于userblogpost结构类型,title字段必须在每个类型中都有完全相同的结构。唯一的例外是copy_todynamicenabledignore_aboveinclude_in_allproperties参数,在每个字段中有不同的设置

通常,拥有相同名称的字段也拥有相同的数据类型,所以拥有相同的结构应该不是问题。当发生冲突时(conflicts do arise),这个问题可以通过选择更详细的名称来解决,比如user_titleblog_title

样例结构(Example mapping)

PUT my_index    #注释1{  "mappings": {     "user": {  #注释2      "_all":       { "enabled": false  },  #注释3      "properties": {  #注释4        "title":    { "type": "string"  },  #注释5        "name":     { "type": "string"  },  #注释6        "age":      { "type": "integer" }   #注释7      }    },    "blogpost": {   #注释8      "properties": {  #注释9        "title":    { "type": "string"  },  #注释10        "body":     { "type": "string"  },  #注释11        "user_id":  {          "type":   "string",  #注释12          "index":  "not_analyzed"        },        "created":  {          "type":   "date",  #注释13          "format": "strict_date_optional_time||epoch_millis"        }      }    }  }}

注释1:创建一个名为my_index的索引
注释2/8:创建一个结构类型名为userblogpost
注释3:禁用user结构类型的_all元域
注释4/9:指定每个结构类型中的字段或属性
注释5/6/7/10/11/12/13:为每个字段指定数据的类型(type)和结构

0 0
原创粉丝点击