Skip to content

进阶检索 (二)

1、Mapping

1)、字段类型

一、数据类型字段类型概述

2)、映射

Mapping(映射) Mapping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的。比如,使用mapping来定义:

  • 哪些字符串属性应该被看做全文本属性(full text fields)。
  • 哪些属性包含数字,日期或者地理位置。
  • 文档中的所有属性是否都能被索引(_all 配置)。
  • 日期的格式。
  • 自定义映射规则来执行动态添加属性。
  • 查看mapping信息
json
GET bank/_mapping
  • 修改mapping信息

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html自动猜测的映射类型

JSON type域 type
布尔型:true 或者 falseboolean
整数:123long
浮点型:123.45double
字符串,有效日期:2014-09-15date
字符串:foo barstring

3)、新版本的改变

Es7 及以上移除了type的概念。

  • 关系型数据库中两个数据表示是独立的,即使他们里面有相同名称的列也不影响使用,但ES中不是这样的。elasticsearch是基于Lucene开发的搜索引擎,而ES中不同type下名称相同的filed最终在Lucene中的处理方式是一样的。

          1  两个不同type下的两个user_name,在ES同一个索引下其实被认为是同一个filed,你必须在两个不同的type中定义相同的filed映射。否则,不同type中的相同字段名称就会在处理中出现冲突的情况,导致Lucene处理效率下降。去掉type能够使数据存储在独立的index中,这样即使有相同的字段名称也不会出现冲突,就像ElasticSearch出现的第一句话一样“你知道的,为了搜索····”。
          2 去掉type就是为了提高ES处理数据的效率。
    

Elasticsearch 7.x

  • URL中的type参数为可选。比如,索引一个文档不再要求提供文档类型。

Elasticsearch 8.x

  • 不再支持URL中的type参数。

解决:

  1. 将索引从多类索引迁移到单类型,每种类型文档一个独立索引
  2. 将已存在的索引下的类型数据,全部迁移到指定位置即可。

1、 创建映射

json
PUT /my_index
{
  "mappings": {
    "properties": {
      "age":{"type": "integer"},
      "email":{"type":"keyword"},
      "name":{"type": "text"}
    }
  }
}

2、 添加新的字段映射

json
PUT /my_index/_mapping
{
  "properties":{
    "employee-id":{
      "type":"keyword",
      "index":false
    }
  }
}

3、更新映射

对于已存在的映射字段,我们不能更新。更新必须创建新的索引进行数据迁移。

4、 数据迁移

先创建出new_twitter的正确映射。然后使用如下方式进行数据迁移

json
POST_reindex [固定写法]
{
  “source”:{
  "index":"twitter" 
},
"dest":{
"index":"new_twitter"
}
}

将旧索引的type下的数据进行迁移

json
POST_reindex
{
  “source:{
   "index":"twitter",
   "type":"tweet"
},
"dest":{
"index":"tweets"
}
}