上一篇主要讲解什么是 URL Search 和 Request Body Search 的语法。本篇对 Mapping 的 Dynamic Mapping 以及手动创建 Mapping 进行讲解。

1.什么是 Mapping

  • Mapping 类似数据库中的 schema 的定义,作用如下

    • 定义索引中的字段的名称
    • 定义字段的数据类型,例如字符串,数值等
    • 字段,倒排索引的相关配置,比如可以通过配置字段是否需要被索引(Analyzed or Not Analyzed,Analyzer)
  • Mapping 会把 Json 文档映射成 Lucene 所需要的扁平格式
  • 一个 Mapping 属于一个索引的 Type,在 7.0 之后版本一个索引只有一个 Type(_doc)
    • 一个 Type 有一个 Mapping 定义
    • 7.0 开始,不需要在 Mapping 定义中指定 type 信息

2.常用字段的数据类型

  • 简单类型

    • Text / Keyword
    • Date
    • Integer / float/ double /long
    • Boolean
    • Ip
  • 复杂类型-对象和嵌套对象
    • 对象类型/嵌套类型
  • 特殊类型(针对地理信息的有特殊处理)
    • geo_point & geo_shape / percolator

3.1什么是 Dynamic Mapping

Dynamic Mapping 会自动根据文档信息,推算出字段的类型,使得你无需手动创建 Mapping。在写入文档时候,而且如果索引不存在,会自动创建索引。但是有时候推算也会错误,例如地理位置信息。当类型如果设置不对时,会导致一些功能无法正常运行,这点要特别注意。

下面总结 Json 类型到 Elasticsearch 类型的自动识别

3.2.Json 类型和 Elasticsearch 类型转换映射

Json 类型 Elasticsearch 类型
字符串 1.匹配日期格式,转为 Date
2.数值转为 float 或者 long,默认关闭
3.转为 Text,并且增加 keyword
布尔值 boolean
浮点数 float
整 数 long
对 象 Object
数 组 由第一个非空数值的类型所决定
空 值 忽略
PUT mapping_test/_doc/1
{
"name":"al",
"age":15,
"ageStr":"15",
"birth":"2019-12-18",
"arg":["aaa","1"],
"flag":false
} GET mapping_test/_mapping

3.3.能否更改 Mapping 字段类型

  • 新增字段情况,Dynamic 设置为 true,带有新字段的文档写入,Mapping 会更新。Dynamic 设置为 false,Mapping 不被更新,新增字段不会被索引。Dynamic 设置为 Strict,带有新字段的文档写入会直接报错。
  • 对已有字段并且存在数据情况,不支持修改字段定义,因为 ES 通过 Lucene 生成倒排索引,一旦生成就不许与修改
  • 如果实在需要修改可以通过 Reindex Api 重建索引
PUT mapping_test/_mapping
{
"dynamic":"false"
} PUT mapping_test/_doc/2
{
"name":"al",
"age":15,
"ageStr":"15",
"birth":"2019-12-18",
"arg":["aaa","1"],
"flag":false,
"addCol":"test"
} GET mapping_test/_search
{
"query": {
"match": {
"addCol": "test"
}
}
}

当前设置 "dynamic":"false"时,新增的字段查询不出结果。

4.1.手动创建 Mapping

上面我们介绍了关于 Dynamic Mapping 功能,现在但我们想要手动创建一个 Mapping 该如何创建。我先看一下下面代码。

PUT student
{
"mappings":{
"properties": {
"firstName":{
"type":"text"
},
"lastName":{
"type":"text"
},
"password":{
"type":"text",
"index":false
}
}
}
} PUT student/_doc/1
{
"firstName":"AA",
"lastName":"BB",
"password":"abc"
} POST student/_search
{
"query": {
"match_phrase": {
"password": {
"query": "abc"
}
}
}
}

上面这个例子,就是一个比较简单手动创建例子,我们通过为每一个字段创建类型,当指定 index:false 时,ES 将不对这个字段建立倒排索引,从上图结果就可以看出。

4.2.Index Options

ES 有四种不同级别的 Index Options 配置

  • docs 记录 doc id
  • freqs 记录 doc id 和 term 频次
  • positions 记录 doc id 和 term 频次 和 term 位置
  • offsets 记录 doc id 和 term 频次 和 term 位置和字符偏移量

Text 类型默认 positions,其他默认为 docs

4.3.copy_to

copy_to 是为瞒足一些特定搜素需求,将多个字段 数值拷贝到目标字段,目标字段不会出现在 _source。在 ES7 中,copy_to 已经替代 copy_to。例如下面这个例子,把 firsetName 和 lastName 合并一起搜素。

PUT student_1
{
"mappings":{
"properties": {
"firstName":{
"type":"text",
"copy_to": "fullName"
},
"lastName":{
"type":"text",
"copy_to": "fullName"
},
"password":{
"type":"text",
"index":false
}
}
}
} PUT student_1/_doc/1
{
"firstName":"AA",
"lastName":"BB",
"password":"abc"
} Get student_1/_search?q=fullName:(AA BB)

5.小结

本篇主要对 Dynamic Mapping 以及手动创建 Mapping 进行讲解,Dynamic Mapping 有好处也有坏处,好处我们无需定义 Mapping,坏处是推算的类型不一定正确,这点要留意。如果手动创建 Mapping 比较推荐先用 Dynamic Mapping 创建生成一个临时索引,查询 Mapping 定义(标题3.2 下面的结果图)修改使用,这样可以减少工作量和出错的概率。

系列文章
【Elasticsearch 7 探索之路】(五)搜索相关 Search-API
【Elasticsearch 7 探索之路】(四)Analyzer 分析
【Elasticsearch 7 探索之路】(三)倒排索引
【Elasticsearch 7 探索之路】(二)文档的 CRUD 和批量操作
【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?

【Elasticsearch 7 探索之路】(六)初识 Mapping的更多相关文章

  1. ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

    这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  2. Elasticsearch入门教程(六):Elasticsearch查询(二)

    原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  3. Elasticsearch笔记七之setting,mapping,分片查询方式

    Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...

  4. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句

    MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...

  5. ElasticSearch(五):Mapping和常见字段类型

    ElasticSearch(五):Mapping和常见字段类型 学习课程链接<Elasticsearch核心技术与实战> 什么是Mapping Mapping类似数据库中的schema的定 ...

  6. 【Elasticsearch 7 探索之路】(三)倒排索引

    上一篇,我们介绍了 ES 文档的基本 CURE 和批量操作.我们都知道倒排索引是搜索引擎非常重要的一种数据结构,什么是倒排索引,倒排索引的原理是什么. 1 索引过程 在讲解倒排索引前,我们先了解索引创 ...

  7. 【Elasticsearch 7 探索之路】(四)Analyzer 分析

    上一篇,什么是倒排索引以及原理是什么.本篇讲解 Analyzer,了解 Analyzer 是什么 ,分词器是什么,以及 Elasticsearch 内置的分词器,最后再讲解中文分词是怎么做的. 一.A ...

  8. 【Elasticsearch 7 探索之路】(五)搜索相关 Search-API

    本节主要讲解 Elasticsearch 的 搜索相关功能 Search-API,讲解什么是 URL Search 和 Request Body Search 的语法,对常用的语法都会一一进行详细介绍 ...

  9. Elasticsearch系列---初识mapping

    概要 本篇简单介绍一下field数据类型mapping的相关知识. mapping是什么? 前面几篇的实战案例,我们向Elasticsearch索引数据时,只是简单地把JSON文本放在请求体里,至于J ...

随机推荐

  1. python字符串有多少字节

    是否有一些函数可以告诉我字符串在内存中占用多少字节? 我需要设置套接字缓冲区的大小,以便一次传输整个字符串. 解决方案 import sys sys.getsizeof(s) # getsizeof( ...

  2. 二、python基础之列表、元组

    一.列表 列表的概念: 列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表中所有字母.数字0-9或所有家庭成员姓名的列表:也可以将任何东西加入列表中,其中的元素之间没有任何关系.鉴于列表通常包 ...

  3. css的9个常用选择器

    1.类选择器(通过类名进行选择) <!DOCTYPE html> <html> <head> <title></title> </he ...

  4. linux c 链接详解1-多目标文件链接

    1. 多目标文件的链接 摘自:linux c编程一站式学习 http://learn.akae.cn/media/index.html 可以学会在linux下将多个c语言文件一起编译. 现在我们把例  ...

  5. java两个数组内存图

  6. 力扣——gas station (加油站) python实现

    题目描述: 中文: 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] ...

  7. 记一次pycharm和vscode因网络问题插件下载失败的问题

    WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connec ...

  8. 探索Redis设计与实现1:Redis 的基础数据结构概览

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  9. inline-block空隙怎么解决

    方法一:移除空格 元素间留白间距出现的原因就是标签段之间的空格,因此,去掉HTML中的空格,自然间距就木有了.考虑到代码可读性,显然连成一行的写法是不可取的,我们可以: <div class=& ...

  10. 漫谈C语言结构体

    相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...