Elasticsearch实战(六)-mapping映射

举报
JavaEdge 发表于 2021/06/03 23:31:22 2021/06/03
【摘要】 1 mapping 作用 类似数据库中的表结构定义,主要作用如下: 定义Index下的字段名( Field Name )定义字段的类型,比如数值型、字符串型、布尔型等定义倒排索弓|相关的配置,比如是否索引、记录position等 2 查看 mapping { "index" : { "mappings" : { "properties" : { "JSON ...

1 mapping 作用

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

  • 定义Index下的字段名( Field Name )
  • 定义字段的类型,比如数值型、字符串型、布尔型等
  • 定义倒排索弓|相关的配置,比如是否索引、记录position等

2 查看 mapping

{
  "index" : { "mappings" : { "properties" : { "JSON 数据" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "公众号" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } }
  }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3 自定义 mapping

类似 MySQL,Mapping中的字段类型一旦设定后,禁止直接修改,原因如下:

  • Lucene实现的倒排索引生成后不允许修改
  • 重新建立新的索引,然后做reindex操作

允许新增字段
通过dynamic参数来控制字段的新增

  • true (默认)允许自动新增字段
  • false不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作
  • strict文档不能写入,报错

copy_to

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

index

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

index_options

控制倒排索弓引|记录的内容,有如下4种配置

  • docs只记录doc id
  • freqs记录doc id和term frequencies
  • positions 记录doc id、term frequencies和term position
  • offsets记录doc id、 term frequencies、 term position和character offsets

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

null_value

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

4 数据类型

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

ES可以自动识别文档字段类型,从而降低用户使用成本,如下所示

PUT /test_index/doc/1
{
  "username": "java",
  "age": "18"
}

GET /test_index/_mapping

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
{
  "test_index" : { "mappings" : { "properties" : { "age" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "username" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } }
  }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

PUT /test_index/doc/1
{"username":" alfred",
"age":14,
"birth":"1988-10-10",
"married":false,
"year":18,
"tags":["boy","fashion"],
"money":100.1
}

GET /test_index/_mapping

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
{
  "test_index" : { "mappings" : { "properties" : { "age" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "birth" : { "type" : "date" }, "married" : { "type" : "boolean" }, "money" : { "type" : "float" }, "tags" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "username" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "year" : { "type" : "long" } } }
  }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

日期的自动识别可以自行配置日期格式,

默认是[ “strict_date_optional_time”,“yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z”]

  • strict_date_optional_time 是 ISO datetime 的格式,完整格式类似下面:
  • YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
    dynamic_date_formats可以自定义日期类型
    date_detection 可关闭日期自动识别的机制

dynamic template

允许根据es自动识别的数据类型、字段名等来动态设定字段类型,可以实现如下效果:

  • 所有字符串类型都设定为keyword类型,即默认不分词
  • 所有以message开头的字段都设定为text类型,即分词
  • 所有以long_开头的字段都设定为long类型
  • 所有自动匹配为double类型的都设定为float类型,以节省空间

匹配规则一般有如下几个参数:

  • match_ mapping _type 匹配 es 自动识别的字段类型,如boolean,long,string
  • match,unmatch 匹配字段名
  • path_ match,path_ unmatch 匹配路径

自定义Mapping的操作步骤

  1. 写一条文档到es的临时索引中,获取es自动生成的mapping
  2. 修改步骤1得到的mapping ,自定义相关配置
  3. 使用步骤2的mapping创建实际所需索引

索引模板

索引模板,英文为Index Template,主要用于在新建索引时自动应用预先设定的配置,简化索索引创建的操作步骤

  • 可以设定索引的配置和mapping

  • 可以有多个模板,根据order设置,order大的覆盖小的配置

  • 索弓|模板API , endpoint为 _template ,如下所示:

获取与删除

参考

  • https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-params.html
  • https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

文章来源: javaedge.blog.csdn.net,作者:JavaEdge.,版权归原作者所有,如需转载,请联系作者。

原文链接:javaedge.blog.csdn.net/article/details/110347342

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。