ES入门(三)Elasticsearch之Mapping(Dynamic Mapping与显示Mapping)

    科技2025-01-19  10

    ES入门(三)Elasticsearch之Mapping(Dynamic Mapping与显示Mapping)

    什么是mapping?

    mapping类似数据库中的schema的定义,作用如下     定义索引中的字段名称     定义字段的数据类型,例如字符串、数字、布尔。。。     字段,倒排索引的相关配置  mapping会把JSON文档映射成Lucene所需要的扁平文档  一个mapping属于一个索引的type     每个文档都属于一个type     一个type有一个mapping定义     7.0开始,不需要在mapping定义中指定type信息

    Mapping中的字段一旦设定后,禁止直接修改。因为倒排索引生成后不允许直接修改。需要重新建立新的索引,做reindex操作。

    Dynamic Mapping

        创建索引但不设置mapping的情况下put数据进索引,es会帮我们自动创建mapping


    未设置mapping的情况下写入文档并查看mapping: PUT mapping_test/_doc/1 { "firstName":"Chan", "lastName": "Jackie", "loginDate":"2018-07-24T10:29:48.103Z" } GET mapping_test/_mapping 返回的mapping结果: { "mapping_test" : { "mappings" : { "_doc" : { "properties" : { "firstName" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "lastName" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "loginDate" : { "type" : "date" } } } } } }

    ES自动创建mapping的映射关系如下:

    能否更改mapping的字段类型,分为两种情况:

        新增字段:

            dynamic设为true时,一旦有新增的document写入,mapping也同时被更新

            dynamic设为false,mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中

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

        已有字段:

        一旦已经有数据写入,就不再支持修改字段定义:Lucene实现的倒排索引,一旦生成后,就不允许修改,如果希望修改字段的类型,必须Reindex,重建索引。

        原因:1. 如果修改字段的数据类型,会导致已被索引的属于无法被搜索

                   2. 如果是增加新的字段,就不会有这样的影响

    索引的dynamic参数设置不同,将有不同的影响:

    显示Mapping

    显示设置索引的mapping语法如下:


    PUT /my_index002 { "mappings": { "_doc" : { "properties" : { "dec" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256, "index": true, //默认值是true "index_options": "offsets", "null_value": "NULL" } } }, "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } }, "fielddata" : true }, "price" : { "type" : "long" }, "producer" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } }, "fielddata" : true }, "tags" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } }, "fielddata" : true } } } } }

    其中字段下的index属性控制当前字段是否被索引。默认为true,如果设置成false,该字段不可被搜索。

    四种不同级别的Index Options配置,可以控制倒排索引记录的内容:

    docs - 记录doc idfres - 记录doc id和term frequenciespositions - 记录doc id / term frequencies / term positionoffsets - doc id / term frequencies / term position / character offsets

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

    记录内容越多,占用存储空间越大

    如何实现对NULL也支持搜索?

    只需要在创建mapping时将需要支持null搜索的字段的null_value属性设置为"NULL",上面的语法可见。

    Processed: 0.013, SQL: 8