multi_field
多域类型允许你对同一个值以映射的方式定义成多个基本类型 core_types . 这个非常有用,比如,如果你定义一个 string
类型的字段,你需要这个字段的分词一会是 analyzed
,但是有时候又希望该字段是 not_analyzed
类型的,通过使用 multi_field
就可以很方便的解决这个问题. 下面来看个例子:
{ "tweet" : { "properties" : { "name" : { "type" : "multi_field", "fields" : { "name" : {"type" : "string", "index" : "analyzed"}, "untouched" : {"type" : "string", "index" : "not_analyzed"} } } } } }
上面的例子,显示了我们是如何定义一个名为 name
的字段, 它的数据类型是 string
字符类型, 该字段映射了两次(实际物理上产生了2个索引字段),其中一个是以 name
的名称 定义为 analyzed
分词类型,另外一个定义成了名称为 untouched
的 not_analyzed
类型,即不分词处理.
字段访问
当使用 multi_field
mapping定义之后, fields里面的和字段名称和外部的字段名称相同的字段定义会被当做该mult-field的默认字段(因为一个multi类型字段会被拆分成多个字段,所以,会有一个默认值),我们可以通过直接名称 name
或者使用 tweet.name
格式的方式来指定字段.
其它定义的不同名称的字段也可以通过使用特点的导航来指定(即使用“.”符合来分割),如: name.untouched
, 或者还带上类型名称 tweet.name.untouched
.
合并Merging
当使用更新mapping接口 put_mapping
的时候,一个基本类型(core type) mapping定义能够自动升级成 multi_field
mapping定义. 这意味着旧的定义是普通的基本类型的mapping,通过保持默认字段一致(即定义的multi-field的默认字段定义保持为旧的mapping的定义),就能够升级为 multi_field
类型.