ElasticSearch | Dynamic Mapping | 常见字段类型

Mapping

  • Mapping 类似于 MySQL 中 Schema 的定义,作用如下:
    • 定义索引中字段的名称;
    • 定义索引中字段的类型;
    • 设置字段 -> 倒排索引的相关配置;
  • Mapping 会把 JSON 文档映射成 Lucene 所需要的扁平格式;

字段的数据类型

简单类型
  • Text / Keyword
  • Date
  • Integer / Floating
  • Boolean
  • IPv4 & IPv6
复杂类型
  • 对象类型
  • 嵌套类型
特殊类型
  • geo_point
  • geo_shape / percolator

Dynamic Mapping

  • 在写入文档的时候 ,如果索引不存在,索引会被自动创建;
  • Dynamic Mapping 的机制,使得无需手动定义 Mappings;
  • ElasticSearch 会自动根据文档信息,推算出字段的类型;
  • 但有时推算的会不对,例如地理位置信息;
  • 如果类型的推算不对,会导致一些功能无法使用,比如 Range 查询;

Dynamic Mapping | 操作示例

向不存在的索引新增文档
  • ElasticSearch 完成 Dynamic Mapping,推断字段的类型;
PUT mapping_test/_doc/1
{
    "uid" : "123",
    "isVip" : false,
    "isAdmin": "true",
    "age":19,
    "heigh":180
}
查看 Dynamic Mapping 的结果
  • GET mapping_test/_mapping
{
  "mapping_test" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "heigh" : {
          "type" : "long"
        },
        "isAdmin" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "isVip" : {
          "type" : "boolean"
        },
        "uid" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}
插入包含新字段的文档
  • 索引的 Mapping 的 dynamic 默认值是 true,意味着,新文档可以索引(存储)到 ElasticSearch 中,新字段可以被索引(搜索),索引的 Mapping 会更新;
PUT dynamic_mapping_test/_doc/1
{
  "newField":"someValue"
}
搜索新插入的文档
  • 新插入的文档的新字段可以被搜索到,新字段也出现在 _source 中;
POST dynamic_mapping_test/_search
{
  "query":{
    "match":{
      "newField":"someValue"
    }
  }
}
修改索引的 Mapping 的 dynamic 为 false
  • 意味着:新增的包含新字段的文档会出现在 _source 中,但是无法被搜索到,Mapping 也不会更新;
PUT dynamic_mapping_test/_mapping
{
  "dynamic": false
}
新增包含新字段的文档
  • 该字段不会被搜索到,mapping 也不会更新,因为 dynamic 被设置成了 false;
#新增 anotherField
PUT dynamic_mapping_test/_doc/10
{
  "anotherField":"someValue"
}
但是查询这个文档
  • 新增的字段会出现在 _source 中
get dynamic_mapping_test/_doc/10
修改 dynamic 为 strict
  • 意味着包含新字段的文档无法写入 ElasticSearch;
PUT dynamic_mapping_test/_mapping
{
  "dynamic": "strict"
}
尝试写入包含新字段的文档
  • 写入失败;
PUT dynamic_mapping_test/_doc/12
{
  "lastField":"value"
}

你可能感兴趣的:(ElasticSearch | Dynamic Mapping | 常见字段类型)