映射
索引中每个文档都有一个类型(type)。每个类型拥有自己的映射(mapping)或者模式定义(schema definition)。一个映射定义了字段类型,每个字段的数据类型,以及字段被Elasticsearch处理的方式。映射还用于设置关联到类型上的元数据。核心简单字段类型
Elasticsearch支持以下简单字段类型:
当你索引一个包含新字段的文档--一个之前没有的字段--Elasticsearch将使用动态映射猜测字段类型,这类型来自于JSON的基本数据类型,使用以下规则:
注意:
这意味着,如果你索引一个带引号的数字--“123”,它将被映射为“string”类型,而不是“long”类型。然而,如果字段已经被映射为“long”类型,Elasticsearch将尝试转换字符串为long,并在转换失败时抛出异常。查看映射
我们可以使用_mapping后缀来查看Elasticsearch中的映射。curl -XGET "http://1.139.32.155:9200/joke/_mapping/jt_joke"
小提示
错误的映射,例如age字段映射为string类型而不是integer类型,会造成查询结果混乱。
要检查映射类型,而不是假设它是正确的!
index
index参数控制字符串以何种方式被索引。它包含以下三个值当中的一个:string类型字段默认是analyzed。如果我们想映射字段为确切值,我们需要设置它为not_analyzed:
{
"tag" : {
"type" : "string",
"index" : "not_analyzed"
}
}
其他简单类型----long、double、date等等----也接受index参数,但相应的值只能是no和not_ananlyzed,它们的值不能被分析。
分析
对于analyzed类型的字符串字段,使用analyzer参数来指定哪一种分析器将在搜索和索引的时候使用。默认的,Elasticsearch使用standard分析器,但是你可以通过指定一个內建的分析器来更改它,例如whitespace、simple、english。{
"tweet" : {
"type" : "string",
"analyzer" : "english"
}
}
更新映射
你可以在第一次创建索引的时候指定映射的类型。此外,你也可以晚些时候为新类型添加映射(或者为已有的类型更新映射)重要:
你可以向已有的映射中增加字段,但你不能修改它。如果一个字段在映射中已经存在,这可能意味着那个字段的数据已经被索引。如果你改变了字段映射,那已经被索引的数据将错误并且不能被正确的搜索到。
我们可以更新一个映射来增加一个新字段,但是不能把已有的字段的类型从analyzed改到not_analyzed。
复合核心字段类型
除了之前的简单的标量类型,JOSN还有null值,数组和对象,所有这些Elasticsearch都支持:多值字段
我们想让tag字段包含多个字段,这非常有可能发生。我们可以索引一个标签数组来代替单一字符串:{"tag":["search","nosql"]}
对于数组不需要特殊的映射。任何一个字段可以包含零个、一个或多个值,同样对于全文字段将被分析并产生多个词。
这就意味着数组中所有的值必须为同一类型。你不能把日期和字符串混合。如果你创建一个新字段,这个字段索引了一个数组,Elasticsearch将使用第一个值的类型来确定这个新字段的类型。
当你从Elasticsearch中取回一个文档,任何一个数组的顺序和你索引它们的顺序一致。你取回的_source字段的顺序同样与索引它们的顺序相同。
然而,数组是做为多值字段被索引的,它们没有顺序。在搜索阶段你不能指定“第一个值”或者“最后一个值”。倒不如把数组当作一个值集合(gag of values)
空字段
当然数组可以是空的。这等价于有零个值。事实上,Lucene没法存放null,所以一个null值的字段被认为是空字段。这四个字段将被识别为空字段而不被索引:
"empty_srting" : "",
"null_value" : null,
"empty_array" : [],
"array_with_null_value" : [null]
多层对象
最后一个自然JSON数据类型是对象(Object)----在其它语言中叫做hashed、hashmaps、dictionaries或者associative arrays内部对象(inner object)经常用于嵌入一个实体或对象里的另一个地方。例如,做在tweet文档中user_name和user_id的替代,我们可以这样写:
{
"tweet" : "Elastcsearch is very good",
"user" : {
"id" : "@johnsmith",
"gender" : "male",
"age" : 26,
"name" : {
"full" : "john Smith",
"first" : "john",
"last" : "Smith"
}
}
}