Elasticsearch使用要点(七)-映射

映射

映射可以理解为es中json文档的字段类型.

Elasticsearch 支持 如下简单域类型:

  • 字符串: text
  • 整数: byte, short, integer, long
  • 浮点数: float, double
  • 布尔型: boolean
  • 日期: date

text类型是es5.0之后代替string类型出现的, 是可以被分析的字段. 在映射一个字段为xxx的text类型的同时, es也会为其创建一个 xxx.keyword的非分析字段.

在索引文档的过程中, 若es发现文档中的某个字段之前未出现过, es会使用动态映射来按照以下的规则猜测字段的类型:

字段值 类型
布尔型: true 或者 false boolean
整数: 123 long
浮点数: 123.45 double
字符串, 有效日期: 2014-09-15 date
字符串: “xxxxxx xxxx xxx” text

一些坑:

  1. 如果一个字段在开始时被es动态映射为了数值类型(如: long), 后续若索引该字段为字符串时, es会尝试将这个字符串转化为long, 如果无法转化, 则抛出一个异常.
  2. 如果一个数值字段在被索引时加上了双引号, 则它会被映射为 text 类型.
  3. 某个字段开始时被动态映射为了text字段, 后面业务中将其改为了有效日期的字符串(如: 2014-09-15), 那么这个字段可以被索引成功, 并且依然是text类型. term查询时需要使用xxx.keyword. 调试时, 删除了该索引然后再次重新索引数据, es的动态映射会给这个字段的类型为date, 导致代码中旧term查询xxx.keyword时无效.

解决办法:

建立索引, 或者增删索引时需要及时查看映射, 必要时更改映射重新索引数据.

查看映射:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// 请求
GET comments/coursecomment/_mapping
// 响应
{
"comments": {
"mappings": {
"coursecomment": {
"properties": {
"avgScore": {
"type": "long"
},
"courseId": {
"type": "long"
},
"isDel": {
"type": "long"
},
"lessonCount": {
"type": "long"
},
"orgId": {
"type": "long"
},
"studentCommentCountSum": {
"type": "long"
},
"studentCountSum": {
"type": "long"
},
"studentTotalScoreSum": {
"type": "long"
},
"syncDate": {
"type": "long"
},
"syncDateStr": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"teacherCommentCountSum": {
"type": "long"
},
"weekEnd": {
"type": "long"
},
"weekEndStr": {
"type": "date"
},
"weekStart": {
"type": "long"
},
"weekStartStr": {
"type": "date"
}
}
}
}
}
}

删除索引:

1
2
3
4
5
6
// 请求
DELETE /comments
// 响应
{
"acknowledge": true
}

创建索引:

1
2
3
4
5
6
// 请求
PUT comments
// 响应
{
"acknowledge": true
}

设置映射:

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT comments/coursecomment/_mapping
{
"coursecomment": {
"properties": {
"weekEndStr": {
"type": "date"
},
"weekStartStr": {
"type": "date"
}
}
}
}