Liuqichun's Blog

Elasticsearch Mapping

Elasticsearch Mapping 类似关系数据库的 schema(模式),Mapping 记录了索引的字段、字段数据类型,以及 Lucene 是怎样索引数据的。

在给新业务数据建索引时,需要进行的第一步就是 Mapping 设计。许多人不重视这个环节,数据量增大后就暴露出了问题。

创建和修改 Mapping API

设计 Mapping 就是为索引字段指定数据类型和索引方式。

可以在创建索引时指定 Mapping,Mapping 创建后不允许修改,可以继续添加 Mapping。

1、创建索引时指定 Mapping

 1PUT <INDEX_NAME>
 2{
 3  "settings": {},
 4  "mappings": {
 5    "properties": {
 6      "name": {
 7        "type": "text",
 8        "analyzer": "standard"
 9      }
10    }
11  },
12  "aliases": {}
13}
14# create index API

2、创建索引后添加 Mapping

1PUT <INDEX>/_mapping
2{
3  "properties": {
4    "email": {
5      "type": "keyword"
6    }
7  }
8}

在 Mapping 设计时需要注意的点:

  1. text 和 keyword 的用途必须分清:分词和关键词(确定字段是否需要分词)
  2. 确定字段是否需要独立存储
  3. 字段类型创建后不支持修改,谨慎创建
  4. 对不需要进行聚合/排序的字段禁用 doc_values

数据类型

基本数据类型

这里是大多数系统都支持的基本数据类型,它们有:

keyword 与 text 对比:

复杂数据类型

复杂数据类型是常见数据类型的组合。

object、nested、flattened 数据类型对比:

专用数据类型

Mapping 元数据

Mapping 内部数据

倒排索引

倒排存储是从单词到文档的映射关系的最佳实现形式。

倒排索引的特点:

倒排索引适合的场景:

正排索引

doc_values 被定义为“正排索引”。

在 Elasticsearch 中,正排索引(doc_values)是一种列式存储结构,默认情况下每个字段的 doc_values 都是激活的(除了 text 类型)。当字段索引时,Elasticsearch 为了能够快速检索,会把字段的值加入倒排索引,同时会存储该字段的正排索引。

正排索引的特点:

fielddata

倒排索引用来解决哪些文档包含这些关键词的问题,正排索引用来解决排序、聚合问题。当一个字段为 text 类型,它不支持正排索引;当 text 类型的字段被用于聚合、排序或者脚本操作时,fielddata 会在内存中按需构建相应的数据。

fielddata 是通过从磁盘读取每一字段的完整倒排索引,反转词项(term)与文档之间的关系,并将结果存储在 JVM 堆内存中构建。

fielddata 特点:

_source 与 store

_source 字段包含索引时传递的原始 JSON,它没有构建索引(因此无法搜索),但 ES 已经存储该字段,以便在执行搜索时将它返回。

_source 字段确实会引起存储开销,可以将其禁用,但是需要做好权衡。禁用 _source 后 reindex API、高亮、update 和 update_by_query API 都将不能使用。

store 可以只让 ES 存储部分文档字段,但副作用和禁用 _source 一样。

null_value 处理空值

null 是一个特殊值,在传统关系数据库中聚合和排序对它无效。在 ES 中,值为 null 的字段被认为无效,ES 不会索引它,后面就无法搜索到。但是业务中 null 往往有含义,经常需要搜索。ES 提供了 null_value 配置选项,可以设置一个默认值,当搜索 null 值时可以用默认值进行代替。


参考:

[1] https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html

<< Previous Post

|

Next Post >>

#Elasticsearch