当ES在文档中探测到新的字符串字段将默认设置为全文string字段并使用标准分析器(standard)分析。为了使用更适合的分析器或者不做任何处理,则需要使用映射(mapping)。

之前提到每个文档都有一个类型(type),每个类型都有一个映射(mapping)或者模式定义(schema definition)一个映射定义了字段类型,每个字段的数据类型,以及字段被Elasticsearch处理的方式。映射还用于设置关联到类型上的元数据。

查看映射

GET /{index}/_mapping/{type}

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
GET /gb/_mapping/tweet

{
"gb": {
"mappings": {
"tweet": {
"properties": {
"date": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"name": {
"type": "string"
},
"tweet": {
"type": "string"
},
"user_id": {
"type": "long"
}
}
}
}
}
}

自定义字段映射

自定义字段映射可以:

  • 区分全文(full text)字符串字段和准确字符串字段。
  • 使用特定语言的分析器
  • 优化部分匹配字段
  • 指定自定义日期格式
1
2
3
4
5
6
{
"tag": {
"type": "string",
"index": "not_analyzed"
}
}
  • type用于标记tag为string类型

  • index如下:

    index的值 说明
    analyzed 默认值 首先分析这个字符串,然后索引。
    not_analyzed 索引这个字段,使之可以被搜索,但是索引内容和指定值一样。
    no 不索引这个字段。这个字段不能为搜索到。

    其他简单类型( long 、 double 、 date 等等)也接受 index 参数,但相应的值只能是 no 和 not_analyzed ,它们的值不能被分析。

  • analyzer
    对于 analyzed 类型的字符串字段,使用 analyzer 参数来指定哪一种分析器将在搜索和索引的时候使用。

    1
    2
    3
    4
    5
    6
    {
    "tweet": {
    "type": "string",
    "analyzer": "english"
    }
    }

更新映射

可以在第一次创建索引的时候指定映射的类型。也可以晚些时候为新类型添加映射(或者为已有的类型更新映射)。

可以向已有映射中增加字段,但不能修改它。如果一个字段在映射中已经存在,这可能意味着那个字段的数据已经被索引。如果你改变了字段映射,那已经被索引的数据将错误并且不能被正确的搜索到。

复合对象的索引结构

对于复杂对象的mapping :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
"gb": {
"tweet": {
"properties": {
"tweet": {
"type": "string"
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"gender": {
"type": "string"
},
"age": {
"type": "long"
},
"name": {
"type": "object",
"properties": {
"full": {
"type": "string"
},
"first": {
"type": "string"
},
"last": {
"type": "string"
}
}
}
}
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"tweet": "Elasticsearch is very flexible",
"user": {
"id": "@johnsmith",
"gender": "male",
"age": 26,
"name": {
"full": "John Smith",
"first": "John",
"last": "Smith"
}
}
}

# 其索引方式为平铺的单层结构:
{
"tweet": [elasticsearch, flexible, very],
"user.id": [@johnsmith],
"user.gender": [male],
"user.age": [26],
"user.name.full": [john, smith],
"user.name.first": [john],
"user.name.last": [smith]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"followers": [
{ "age": 35, "name": "Mary White"},
{ "age": 26, "name": "Alex Jones"},
{ "age": 19, "name": "Lisa Smith"}
]
}

# 其索引方式为平铺的单层结构:
{
"followers.age": [19, 26, 35],
"followers.name": [alex, jones, lisa, smith, mary, white]
}