本文从Mapping简介、Dynamic Mapping、自定义Mapping和Mapping常用参数说明4个部分介绍Elasticsearch如何设置Mapping。

3.1 Mapping简介

3.1.1 什么是Mapping

Mapping类似数据库中的表定义,主要作用如下:

  1. 定义索引下的字段名
  2. 定义字段的类型,比如数值型、字符串型、布尔型等
  3. 定义倒排索引相关的配置,比如是否索引、记录position等

使用API获取Mapping:

request:GET /test_index/_mapping

response:

{
"test_index" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
}, "username" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}

3.1.2 Mapping支持的数据类型

  • 核心数据类型

    • 字符串型:text、keyword
    • 数值型:long、integer、short、byte、double、float、half_float、scaled_float
    • 日期类型:date
    • 布尔类型:boolean
    • 二进制类型:binary
    • 范围类型:integer_range、float_range、long_range、double_range、data_range
  • 复杂类型
    • 数组类型:array
    • 对象类型:object
    • 嵌套类型:nested object
  • 特殊类型
    • 地理位置:geo_point、geo_shape、
    • IP地址:IPv4、IPv6
    • 自动补全:complete
    • percolator
  • 多字段特性:multi-fields
    • 允许对同一字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索
    • 实现方式:在人名中新增一个子字段为pinyin即可

3.2 Dynamic Mapping

3.2.1 什么是Dynamic Mapping

  • 在文档写入的时候,如果索引不存在,会自动创建索引
  • Dynamic Mapping的机制,使得无需手动定义Mapping,Elasticsearch会自动识别字段的类型,从而降低用户的使用成本
  • 但是有时候会推算的不对,例如地址位置信息
  • 当类型如果设置不对时,会导致一些功能无法正常使用,例如Range查询

3.2.2 类型的自动识别

ES依靠JSON文档的字段类型来实现自动识别字段类型,支持的类型如下:

JSON类型 ES类型
null 忽略
boolean boolean
浮点类型 float
整数 long
object object
array 由第一个非null值的类型决定
string 匹配日期格式,设置为Date(默认开启);匹配数字,设置为float或者long(默认关闭);设置为Text,并且增加keyword子字段

3.2.3 Dynamic的设置

当创建Index的时候,dynamic字段可以设置成3种值:true、false、strict。

例如:

PUT movies
{
    "mapping":{
        "_doc":{
            "dynamic":"false"
        }
    }
}
true false strict
文档可索引
字段可索引
Mapping被更新

说明:

  • 当设置成true的时候,文档可以被索引,字段可以被搜索,Mapping文件可以更新。
  • 当dynamic被设置成false的时候,新增字段的数据可以写入ES;该数据可以被索引,但是新增字段不可被搜索。
  • 当设置成strict的时候,数据写入直接报错。

3.3 自定义Mapping

3.3.1如何自定义Mapping

自定义Mapping的一些建议

  • 可以参考API手册,纯手写
  • 为了减少工作量,减少出错率,可以参考以下步骤:
    1. 创建一个临时的index,写入一些样本数据
    2. 通过访问Mapping API获得该临时文本的动态Mapping定义
    3. 修改后,使用该配置创建索引
    4. 删除临时索引

3.3.2 能否更改Mapping的字段类型

ES能否更改Mapping的字段类型,需要分两种情况进行分析。

1. 新增字段

dynamic设置为true(默认值)时,一旦有新增字段的文档写入,Mapping也同时被更新。

dynamic设置为false时,Mapping不会被更新,更新字段的数据无法被索引,但是信息会出现在_source中,换言之,文档可以正常写入,但是无法对字段进行搜索。

dynamic设置为strict时,文档写入失败。

2. 对已有字段,一旦已经有数据写入,就不再支持修改字段定义。因为ES是基于Lucene实现的倒排索引,一旦生成后,就不允许修改。因为如果修改了字段的数据类型,会导致已被索引的数据无法被搜索。如果希望修改字段类型,必须使用Reindex API进行重建索引。

3.4 Mapping常用参数说明

  • copy_to

    将该字段复制到目标字段,实现类似_all的作用;不会出现在_source中,只用来搜索

  • index

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

    例如某些场景希望敏感信息不用来做搜索,可以将index设置为false,则不可以用来搜索,也可以节省空间。

    index_option用于控制倒排索引记录的内容,有4种配置:

    1. docs只记录doc id
    2. freqs记录doc id和term frequencies
    3. positions记录doc id、term frequencies和term position
    4. offsets记录doc id、term frequencies、term position和character offsets

      text类型默认配置为positions。其他默认是docs。当然记录内容越多,占用空间越大。
  • null_value

    当字段遇到null值时的处理策略,默认为null,即空值,此时es会忽略该值;可以通过设定该属性设定字段的默认值。

更多常用参数可以参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping-params.html

Elasticsearch核心技术(三):Mapping设置的更多相关文章

  1. 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

    第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...

  2. Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

    Beats,Logstash负责数据收集与处理.相当于ETL(Extract Transform Load).Elasticsearch负责数据存储.查询.分析.Kibana负责数据探索与可视化分析. ...

  3. Elasticsearch核心技术(2)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)

    Elasticsearch核心技术(2)--- 基本概念 这篇博客讲到基本概念包括: Index.Type.Document.集群,节点,分片及副本,倒排索引. 一.Index.Type.Docume ...

  4. Elasticsearch核心技术(五):搜索API和搜索运行机制

    本文将从数据存储和搜索的角度简单分析Elasticsearch的搜索运行机制,主要涉及搜索API.搜索机制.存在问题和解决方案. 4.1 Search API Search API允许用户执行一个搜索 ...

  5. ElasticSearch第三步-中文分词

      ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticS ...

  6. elasticsearch中的mapping映射配置与查询典型案例

    elasticsearch中的mapping映射配置与查询典型案例 elasticsearch中的mapping映射配置示例比如要搭建个中文新闻信息的搜索引擎,新闻有"标题".&q ...

  7. elasticsearch篇之mapping

    2018年05月17日 18:01:37 lyzkks 阅读数:444更多 个人分类: Elastic stack   版权声明:文章内容来自于网络和博主自身学习体会,转载请注明出处,欢迎留言大家一起 ...

  8. elasticsearch 权威指南Mapping(映射)

    什么是映射 类似于数据库中的表结构定义,主要作用如下: 定义Index下字段名(Field Name) 定义字段的类型,比如数值型,字符串型.布尔型等 定义倒排索引的相关配置,比如是否索引.记录pos ...

  9. ElasticSearch(三):通分词器(Analyzer)进行分词(Analysis)

    ElasticSearch(三):通过分词器(Analyzer)进行分词(Analysis) 学习课程链接<Elasticsearch核心技术与实战> Analysis与Analyzer ...

  10. 关于ElasticSearch的堆内存设置与优化

    1.什么是堆内存?Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:- 新生代 ( Young ).- 老年代 ( Ol ...

随机推荐

  1. [第十三篇]——Docker Compose之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Compose Compose 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具.通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务.然 ...

  2. golang指针接收者和值接收者方法调用笔记

    初学go时很多同学会把 值接收者 和 指针接收者 的方法相互调用搞混淆,好多同学都只记得指针类型可以调用值接收者方法和指针接收者方法,而值类型只能调用值接收者方法,其实不然,在某些情况下,值类型也是可 ...

  3. c# 扩展方法奇思妙用基础篇九:Expression 扩展

    http://www.cnblogs.com/ldp615/archive/2011/09/15/expression-extension-methods.html .net 中创建 Expressi ...

  4. Spring Boot 2.x 之 Logging

    [源起] 最近在看Apollo的源码,发现其all-in-one项目的脚本demo.sh在执行的时候,竟然没有向控制台输出Spring Boot的日志. 我们修改后构建的Fat Jar,在启动时却打印 ...

  5. 基于Tensorflow + Opencv 实现CNN自定义图像分类

    摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验. 本文分享自华为云社区< ...

  6. Java基础系列(10)- 类型转换

    类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换.运算中,不同类型的数据先转换为同一类型,然后进行运算. 低 ------------------------------ ...

  7. Shell系列(14)- declare声明变量

    declare声明变量类型 格式 declare [+/-] [选项] [变量名] 选项 -:给变量设定类型属性 +:取消变量的类型属性 -a :将变量声明为数组型 -i :将变量声明为整数型(int ...

  8. 制作ppt最少必要知识

    设计PPT的最少必要知识是什么呢?其实,只要记住两个词就可以了. 简洁,留白. 简洁,就是有很简单的实施方案:在任何一个视觉框架之中,都要尽量减少元素的数量(如形状.线条样式.颜色的数量等),将它们控 ...

  9. YbtOJ#752-最优分组【笛卡尔树,线段树】

    正题 题目链接:http://www.ybtoj.com.cn/problem/752 题目大意 \(n\)个人,每个人有\(c_i\)和\(d_i\)分别表示这个人所在的队伍的最少/最多人数. 然后 ...

  10. Vue router中携带参数与获取参数

    Vue router中携带参数与获取参数 携带参数 query方式,就是?+&结构,例如/login?id=1 <router-link :to="{ name:'login' ...