ES6-映射(mapping)

1.mapping映射概述

我们习惯上对ElasticSearch和数据库做了一些对比,索引(index)相当于数据库,类型(type)相当于数据表,映射(Mapping)相当于数据表的表结构。

ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等等。

映射可以分为动态映射和静态映射:

动态映射:我们知道,在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据。而ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。

静态映射:在ElasticSearch中也可以事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。

2.动态映射

我们新创建一个索引information

PUT information

创建成功响应:

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "information"
}

查看mapping结构:

GET information/_mapping

查询到mapping结构为空:

{
  "information": {
    "mappings": {}
  }
}

插入文档信息:

PUT information/record/1
{
  "ip":"10.192.168.4",
  "attack_type":"scan_ip",
  "count": 400,
  "create_time":"2018-03-07 00:00:00"
}

创建成功:

{
  "_index": "information",
  "_type": "record",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

然后我们再次查询mapping结构:

{
  "information": {
    "mappings": {
      "record": {
        "properties": {
          "attack_type": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "count": {
            "type": "long"
          },
          "create_time": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "ip": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

在添加文档时ElasticSearch会推测添加文档中每个属性字段是什么类别:

record推测结果:

attack_type:text类型

count:long类型

create_time:text类型(实际应该为date类型,推测并不是非常准确)

ip:text类型

3.动态映射规则

动态映射可以帮助我们在创建索引后直接将文档数据写入ElasticSearch,让我们尽快享受到ElasticSearch检索功能。在实际项目中,如果在导入数据前不能确定包含哪些字段或者不方便确定字段类型,可以使用动态映射。当向ElasticSearch写入一个新文档时,需要一个之前没有的字段,会通过动态映射来推断该字段类型。

JSON数据自动推测的类型
null没有字段被添加
true或falseboolean型
小数float型
数字long型
日期date或text
字符串text
数组由数组第一个非空值决定
JSON对象object类型

4.静态映射

动态映射的自动类型推测功能并不是100%正确的,这就需要静态映射机制。静态映射与关系数据库中创建表语句类型,需要事先指定字段类型。相对于动态映射,静态映射可以添加更加详细字段类型、更精准的配置信息等。

新建静态映射:

首先删除已经创建的information索引,然后再创建索引是定义mapping结构

PUT information
{
  "mappings": {
    "record":{
      "properties": {
        "ip":{"type": "text"},
        "count":{"type": "long"},
        "create_type":{"type": "date"},
        "i_type":{"type": "text"}
      }
    }
  }
}

执行成功:

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "information"
}

查看索引mapping结构:

GET information/_mapping

响应结果:

{
  "information": {
    "mappings": {
      "record": {
        "properties": {
          "count": {
            "type": "long"
          },
          "create_type": {
            "type": "date"
          },
          "i_type": {
            "type": "text"
          },
          "ip": {
            "type": "text"
          }
        }
      }
    }
  }
}

类型是Elasticsearch的一个设计失误,6.0开始后面的版本将不再支持,在6.x中创建的索引只允许每个索引有单一类型。任何名字都可以用于这个类型,但是只能有一个。 

转载于:https://my.oschina.net/u/3100849/blog/1839007

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值