Elasticsearch(映射)

来源:互联网 发布:2017网络问卷调查 编辑:程序博客网 时间:2024/05/29 03:50

映射

索引中每个文档都有一个类型(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"
        }
    }
}














原创粉丝点击