美文网首页Elasticsearch 搜索之路
【Elasticsearch 7 探索之路】(六)初识 Mapp

【Elasticsearch 7 探索之路】(六)初识 Mapp

作者: 隐峯 | 来源:发表于2019-12-25 17:02 被阅读0次

    上一篇主要讲解什么是 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
    
    image

    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"时,新增的字段查询不出结果。


    image

    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"
          }
        }
      }
    }
    
    image

    上面这个例子,就是一个比较简单手动创建例子,我们通过为每一个字段创建类型,当指定 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)
    
    image

    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 探索之路】(六)初识 Mapp

        本文链接:https://www.haomeiwen.com/subject/mawcoctx.html