ElasticSearch之Mapping设置

ElasticSearch 中的 Mapping 类似与数据库中的表结构定义。Mapping 中的字段类型一旦设定后,禁止直接修改,原因是Lucene 实现的倒排索引生成后不允许修改,如果非要更改,只能重新建立索引,然后做 reindex 操作。Mapping 主要作用如下:

  • 定义 Index 下的字段名;
  • 定义字段的类型,如数值型,字符串型,布尔型;
  • 定义倒排索引相关的配置,如是否索引,记录 position等。

 

1. ES 的数据类型

1.1 基本数据类型

  • 字符串类型,如:text,keyword
  • 数值类型,如:long,integer,short,byte,double,float,half_float,scaled_float
  • 日期类型,如:date
  • 布尔类型:如:boolean
  • 二进制类型:如:binary
  • 范围类型:如:double_range,integet_range,long_range,float_range,date_range

 

1.2 复杂数据类型

  • 数值类型:array
  • 对象类型:object
  • 嵌套类型:nested object

 

1.3 地理位置类型

  • geo_point
  • geo_shape

 

1.4 专用类型

  • 记录 IP 地址: ip
  • 记录分词数:token_count
  • 记录字符串 hash 值:murmur3

 

2 定义 Mapping

2.1 Mapping 的设定

ES 中的 Mapping 的设定有两种方式,一种是 Dynamic mapping,即 ES 可以自动识别字段类型,从而降低用户使用成本;另一种是自定义 Mapping。

# Dynamic Mapping
PUT test_mapping/doc/1
{
  "username": "alfred way",
  "job": "java engineer",
  "age": 18,
  "birth": "1990-01-02",
  "isMarried": false,
  "salary": 10000
}

# 自定义 mapping
PUT test_mapping1
{
  "mappings": {
    "_doc": {
      "properties": {
        "username": {
          "type": "keyword"
        },
        "title": {
          "type": "text"
        },
        "age": {
          "type": "integer"
        }
      }
    }
  }
}

# 获取索引的 Mapping
GET test_mapping/_mapping

{
  "test_mapping" : {
    "mappings" : {
      "doc" : {
        "properties" : {
          "age" : {
            "type" : "long"
          },
          "birth" : {
            "type" : "date"
          },
          "isMarried" : {
            "type" : "boolean"
          },
          "job" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "salary" : {
            "type" : "long"
          },
          "username" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    }
  }
}

 

2.2 Mapping params

dynamic

Mapping 允许新增字段,但是可以通过 dynamic 参数控制字段的新增:true(默认)允许字段的新增;false 不允许新增字段,但是文档可以正常写入,但无法对字段进行查询等操作;strict 文档不能写入,会报错。

copy_to

将该字段的值复制到目标字段,实现类似于 _all 的功能,不会出现在 _source 中,只能用来搜索。

index

控制当前字段是否索引,默认为 true ,即记录索引,false 不记录,即不可搜索。

index_options

用户控制倒排索引记录的内容,有如下四种配置:docs,只记录 docs id;freqs,记录 docs ID 和 term frequencies;positions,记录 docs ID、term frequencies 和 term position;offsets,记录 docs ID、term frequencies 、 term position 和 character offsets。text 字段默认配置为 positions,其他字段类型默认 dics。记录内容越多,占用空间越大。

null_value

当字段遇到 null 值的处理策略,默认为 null,即空置,此时 ES 会忽略该值,可以通过设置该参数来设定字段的默认值。

多字段特性 multi_fields

允许对同一字段进行不通的配置。比如分词,常见例子如对人名进行拼音搜索,只需要在人名中新增一个子字段 pinyin 即可。

 

3. Mapping 建议

自定义 Mapping 的操作步骤如下:

  1. 写入一条文档到 ES 的临时索引中,获取 ES 自动生成的 Mapping;
  2. 修改步骤1得到的 Mapping,自定义相关配置;
  3. 使用步骤2的 Mapping,创建实际所需索引。

你可能感兴趣的:(ELK,ElasticSearch,Mapping)