一、Mapping的概念

  1、Mapping类似于数据库中的Schema的定义,作用如下:

    1)定义索引中的字段的名称;

    2)定义字段的数据类型,例如字符串、数字、日期、布尔等;

    3)对每个字段进行倒排索引的建立及相关配置;

    4)Mapping会将Json文档映射成Lucene所需要的扁平格式;

    5)一个Mapping属于一个索引的Type,从7.0开始,不需要在Mapping中指定Type信息;

  2、字段的数据类型

    1)简单类型

      Text(会增加Keyword子字段);

      Date;

        Integer/Long/Floating;

      Boolean;

      IP4&IP6;

      Keyword;

    2)复杂类型

      对象类型;

      嵌套类型;

      数组(由第一个非空数值的类型所决定);

      空值;

    3)特殊类型(地理信息)

      geo_point&geo_shape

二、Dynamic Mapping的概念

  1、在写入文档的时候,如果索引不存在,则会自动创建索引;

  2、由于上述机制,可以无需手动定义Mapping,ElasticSearch会自动根据文档信息,推算出字段的类型;

  3、但是有时候推算的可能不对,当类型设置的不对时,会导致一些功能无法正常运行,比如范围内的Range查询;

三、Mapping与Dynamic Mapping的使用

  1、推断字段的类型

//创建一个文档
put mapping_test/_doc/1
{
"id":"100",
"isvip":false,
"isadmin":"true",
"age":18,
"height":180
}
//查看索引Mapping结构
get mapping_test/_mapping
//删除索引
delete mapping_test

   

  由上图中可以得出,ElasticSearch基本上可以按照数据推断出预想的字段类型,由于isadmin字段的值是由双引号所括起来的,所以该字段被推断成text类型。

  2、更改Mapping的字段类型

  对于索引后期加入的字段,可以按照如下情况进行设置:

    1)新增加字段

      a)Dynamic设置为True时,一旦有新增字段的文档写入,Mapping同时会被更新;

      b)Dynamic设置为False时,有新增字段的文档写入,Mapping不会被更新,新增字段的数据也无法被索引,但是信息会出现在_Source中;

      c)Dynamic设置成Strict时,文档写入失败;

    

    2)已有字段

      a)对于已有字段,一旦已经有数据写入,就不再支持修改字段定义。因为Lucene实现的倒排索引,一旦生成后,就不允许修改。

      b)如果希望改变已有字段类型,必须ReIndex,重建索引;

      为什么会这样?

      I)如果修改了字段的数据类型,会导致已被索引的属于无法被搜索;

      II)正因为如此,对于新增加的字段,就不会有这个问题的影响;

  3、对于这几种情况,我们通过下图进行演示:

    1)对于dynamic为true时,对于创建的文档中的某一字段进行搜索,是可以查询到的。

    

    2)将dynamic设置为false,然后新增一个name字段,然后对其搜索,是无法搜索到的。

    

    同时mapping中也不存在该字段。

    

    但是可以在_Source中看到这个字段。

    

    3)将dynamic设置为strict,然后新增一个grade字段,会发现出现异常。

    

四、索引Mapping的显式定义

  1、Mapping定义的方式有两种:

    1)可以参考API手册,纯手写;

    2)为了减少输入工作量,减少出错概率,可以依照以下步骤:

      a)创建一个临时的Index,写入一些样本数据;

      b)通过访问Mapping API获取该临时索引的动态Mapping定义;

      c)修改成符合要求的Json,然后创建显式索引;

      d)将临时索引删除;

  2、显式Mapping定义的语法:

Put Index_Name
{
"mappings":{
定义Mapping信息,Json格式
     "properties":{
        "column_name":{
          "type":"text"
        },
        "column_name":{
          "type":"long"
        }
        ...
      }
}
}

  3、显式Mapping定义的说明:

    1)控制当前字段是否可以被索引,默认是True。如果设置成False,则该字段不可被搜索。

     将不被搜索的字段设置成索引为false,可以节省磁盘开销,因为这样该字段就不需要进行倒排索引了。

    2)对于需要索引的字段,ElasticSearch提供了Index_options配置,可以控制倒排索引记录的内容,Index_options提供了四种控制级别:

      a)docs:记录doc的Id;

      b)freqs:记录doc Id、Term Frequencies;

      c)positions:记录doc Id、Term Frequencies、Term Position;

      d)offsets:记录doc Id、Term Frequencies、Term Position、Character offsets;

    3)Text类型默认是positions级别,其他类型默认是docs级别;

    4)索引字段需要记录的内容越多,那么占用存储空间越大;

    5)只有keyword类型支持设定Null值;

    

    6)copy_to的设置,是将字段的值拷贝到所设定的目标字段中,当查询时,可以将该目标字段做为搜索字段进行查询。但是该目标字段不会出现在_source中。

    

    7)数组类型在ElasticSearch中并不提供,但是对于任何字段,是可以包含多个相同类型的数据的。

     

    8)对字段还可以指定特定的analyzer。

    

    9)查看索引Mapping,如下所示:  

    

五、ElasticSearch字段特性与自定义Analyzer

  1、Exact Values(精确值)、Full Text(全文本)

    Exact Values就是指具体数字、日期、字符串,此类值是不需要进行分词的;

    Full Text:是非结构化的文本数据,是需要进行分词的;

  

  2、自定义分词器

  当ElasticSearch自带的分词器无法满足要求时,可以自定义分词器,通过组合不同的Character Filter、Tokenizer、Token Filter进行实现。

  1)Charater Filters

    a)在Tokenizer之前,通过使用Character Filters对文本进行处理,如删除或者替换字符。此种处理会影响后续Tokenizer对Term的Position与Offset的信息。

    b)可以设置多个Character Filters,一个自带的Character Filters包括:HTML Strip(去除HTML标签)、Mapping(字符串替换)、Pattern Replace(正则表达式替换)。

    如下图所示:

    

    

    

  2)Tokenizer

    a)将原始的文本按照一定的规则,进行切分成词(Term or Token);

    b)内置的Tokenizer有:Standard、uax_url_email、WhiteSpace、keyword、Pattern、Path hierarchy;

    c)可以实现自己的Tokenizer插件;

    如下图所示:

    

  3)Token Filters

    a)将Tokenizer输出的Term,进行增加、修改、删除;

    b)内置的Token Filters有:lowercase、stop、synonym(近义词);

    如下图所示:

    

  3、自定义Analyzer使用

   

  在图中的emotion、customer、english_stop,是分别对Character Filter、Tokenizer、Token Filter的自定义配置。

  

  注意:字段类型keyword与text类型的子字段keyword的说明:

    1、一切文本类型的字符串可以定义成"text"或"keyword"两种类型。区别在于,text类型会使用默认分词器分词(当然也可以指定特定的分词器),keyword类型默认不会对其进行分词;

    2、多字段类型情况下,查询时可以用title,也可以用title.keyword查询类型为keyword的子字段;

  大家可关注我的公众号

   

  知识学习来源:阮一鸣:《Elasticsearch核心技术与实战》

ElasticStack学习(七):ElasticSearch之Mapping初探的更多相关文章

  1. Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer

    原文:Elasticsearch7.X 入门学习第七课笔记-----Mapping多字段与自定义Analyzer 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...

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

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

  3. ELK学习总结(4-1)elasticsearch更改mapping(不停服务重建索引)

    elasticsearch更改mapping(不停服务重建索引)原文 http://donlianli.iteye.com/blog/1924721Elasticsearch的mapping一旦创建, ...

  4. elasticsearch 之mapping

    搭好elk 后,有时候会发现kibana 统计数据时,数据类型不对,这个时候就和elasticsearch的mapping有关,虽然我们可以用logstash修改传入es里的数据类型,比如 float ...

  5. elasticsearch的mapping映射

    Mapping简述 Elasticsearch是一个schema-less的系统,但并不代表no shema,而是会尽量根据JSON源数据的基础类型猜测你想要的字段类型映射.Elasticsearch ...

  6. curl方式创建elasticsearch的mapping

    curl方式创建elasticsearch的mapping curl -XPUT 'http://192.168.1.105:9200/bank/item2/_mapping' -d '{ " ...

  7. Knockout应用开发指南 第七章:Mapping插件

    原文:Knockout应用开发指南 第七章:Mapping插件 Mapping插件 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些 ...

  8. vue学习之vue基本功能初探

    vue学习之vue基本功能初探: 采用简洁的模板语法将声明式的将数据渲染进 DOM: <div id="app"> {{ message }} </div> ...

  9. elasticsearch更改mapping(不停服务重建索引)

    转载地址:http://donlianli.iteye.com/blog/1924721?utm_source=tuicool&utm_medium=referral Elasticsearc ...

随机推荐

  1. 不能继承于QObject的类就一定不能使用信号槽?(用一个代理类进行发射就行了)

    首先不能继承QObject的情况在开发中遇到得并不多,笔者在一年多的Qt项目开发中只遇到两三次.而且都是因为引进了第三方库导致编译过程中报错. 要想解决这个问题其实不难,因为笔者遇到的问题都是想定义一 ...

  2. 从零开始学习音视频编程技术(三) 开发环境搭建(Qt4.86手动设置环境,主要就是设置g++和qmake,比较透彻,附下载链接)

    1.先下载安装Qt 我们使用的版本是4.8. 可以自行百度下载也可以从下面的网盘地址下载: Qt库和编译器下载: 链接:http://pan.baidu.com/s/1hrUxLIG 密码:0181 ...

  3. 应用ImageJ对荧光图片进行半定量分析

    原文 应用ImageJ对荧光图片进行半定量分析 前言ImageJ是个好东西……(省略1000字)总地来说对我们的好处是:1.免费2.多功能,基本功能就很多,加上插件可以说得上是无限多(前提是你找得到, ...

  4. QT 那些事

    一直做的是windows开发,有2个小项目想做到手机.看来看去,选择了QT.本文介绍自己的学习的一些心得,希望对你有帮助.1.选择QT2.安卓的一些事3.QML调用C++4.资源集成(比较有用,网上资 ...

  5. Setting up multi nodes live migration in Openstack Juno with devstack

    Setting up multi nodes live migration in Openstack Juno with devstack Summary Live migration overvie ...

  6. Delphi下IOC 模式的实现(反转模式,即Callback模式)

    IOC英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你.Ioc模式是解决调用者和被调用者之间关系的模式,可以有效降低软件的耦合度,并适合团 ...

  7. VC++的Unicode编程

    本文来自:http://tech.ddvip.com/2007-03/117395585321221.html 一.什么是Unicode 先从ASCII说起,ASCII是用来表示英文字符的一种编码规范 ...

  8. C#每天进步一点--异步编程模式

    C#可以有一个简单易用的机制用于异步执行方法,那就是委托.下面我介绍三种模式,对于这三种模式来说,原始线程都发起了一个异步方法,然后做一些其他处理.然而这些模式不同的是,原始线程获取发起的线程已经完成 ...

  9. 【Zookeeper02】ZK的作用以及使用

    上一篇介绍了ZK的安装以及集群的搭建,这只能算是个软件安装过程,具体是做什么的.怎么用也没有做解释,这一篇中博主就自己的私人理解简单写一下: 1.是什么: a.Zookeeper是一个分布式协调服务, ...

  10. maven的下载与安装,卸载替换eclipse自带的maven

    首先呢,博主在这里给大家一个建议,最好不要用eclipse自带的maven.因为这家伙总会出现一些这样那样的错误,比如常见的jar包下载不全或者是install打包报错等等. 博主用了一段时间,还是觉 ...