Elasticsearch数据类型和mapping


2021-11-19

说明

ElasticSearch有着丰富的数据类型规则和数据属性设置,数据类型决定数据规则,特别字符串类型,text默认分词,keyword不分词,这将直接影响查询方式和结果,同样,mapping可以设置哪些字段建立索引,原始数据是否存储,这些都会影响数据存储量和实际查询效率。

分享

资料

字段类型

一级分类二级分类具体类型
核心类型字符串string(废弃)、text、keyword
整数型integer、long、short、byte
浮点型double、float、half_float、scaled_float
逻辑型boolean
日期型date
范围型range
二进制binary
符合类型数组array
对象型object
嵌套型nested
地理类型地理坐标geo_point
地理地图geo_shape
特殊类型ip类型ip
范围类型completion
令牌计数类型token_count
附件类型attachment
抽取类型percolator

各类型说明

字符串

类型说明
stringElasticsearch5后不再支持,改用keywor和text
keyword内容不会拆分,只能全内容匹配
text内容默认拆分,可以查到拆开部分,全内容匹配无效,当一个字段需要用于全文搜索(会被分词), 比如产品名称、产品描述信息, 就应该使用text类型.

数值型

类型范围
byte有符号的8位整数, 范围:-128 ~ 127
short有符号的16位整数, 范围:-32768 ~ 32767
integer有符号的32位整数, 范围: − 2 31 -2^{31} 231 ~ 2 31 2^{31} 231-1
long有符号的64位整数, 范围: − 2 63 -2^{63} 263 ~ 2 63 2^{63} 263-1

浮点型

类型范围
double64位双精度IEEE 754浮点类型
float32位单精度IEEE 754浮点类型
half_float16位半精度IEEE 754浮点类型
scaled_float缩放类型的的浮点数, 比如price字段只需精确到分, 57.34缩放因子为100, 存储结果为5734

范围数值类型

类型范围
integer_range有符号的32位整数, 范围: − 2 31 -2^{31} 231 ~ 2 31 2^{31} 231-1
float_range32位单精度IEEE 754浮点类型
long_range有符号的64位整数, 范围: − 2 63 -2^{63} 263 ~ 2 63 2^{63} 263-1
double_range64位双精度IEEE 754浮点类型
date_range自系统历元以来无符号64位整数范围内的毫秒数范围
ip_range支持 IPv4 或者 IPv6 (or mixed) 地址的IP范围

时间类型

  • 日期类型表示格式可以是以下几种:
    • 日期格式的字符串,比如 “2018-01-13” 或 “2018-01-13 12:10:30”
    • long类型的毫秒数( milliseconds-since-the-epoch,epoch就是指UNIX诞生的UTC时间1970年1月1日0时0分0秒)
    • integer的秒数(seconds-since-the-epoch)

binary类型

  • 进制字段是指用base64来表示索引中存储的二进制数据,可用来存储二进制形式的数据,例如图像。默认情况下,该类型的字段只存储不索引。二进制类型只支持index_name属性。

array类型

  • 常用数组如下:
    • 字符数组: [ “one”, “two” ]
    • 整数数组: productid:[ 1, 2 ]
    • 对象(文档)数组: “user”:[ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }],
  • 注意:lasticSearch不支持元素为多个数据类型:[ 10, “some string” ]

object类型

JSON对象,文档会包含嵌套的对象

ip类型

ip类型的字段用于存储IPv4或者IPv6的地址

mapping属性

enabled

仅存储、不做搜索和聚合分析,实例:"enabled":true (缺省)| false

index

是否构建倒排索引(即是否分词,设置false,字段将不会被索引),实例:"index": true(缺省)| false

index_option

  • 存储倒排索引的哪些信息,有4个可选参数
    • docs:索引文档号
    • freqs:文档号+词频
    • positions:文档号+词频+位置,通常用来距离查询
    • offsets:文档号+词频+位置+偏移量,通常被使用在高亮字段
  • 分词字段默认是positions,其他默认时docs,实例:"index_options": "docs"

_source

  • 是否存储字段原始字段内容,默认存储,如果文档中字段内容过大,存储原始字段将增加集群存储数据量,可设置不存储,更加查询id到mysql或hbase查询。

norms

  • 是否归一化相关参数,如果字段仅用于过滤和聚合分析可关闭,分词字段默认配置,不分词字段:默认{“enable”: false},存储长度因子和索引时boost,建议对需要参加评分字段使用,会额外增加内存消耗,实例:"norms": {"enable": true, "loading": "lazy"}
  • 如果关闭_source,只会返回文档id和type,没有内容,设置如下:
{
    "type":{
        "_source":{
            "enabled":false
        },
        "properties": {
            ... 
        }
    }
}
  • 如果仅存储部分字段,可设置:
{
    "type":{
        "_source":{
            "includes":["field1","field2"]
        },
        "properties": {
            ... 
        }
    }
}
  • 排除部分字段,可设置:
{
    "type":{
        "_source":{
            "excludes":["field1","field2"]
        },
        "properties": {
            ... 
        }
    }
}

all

默认关闭,开启_all字段,索引量将大很多,_all字段开启,适用于不指定字段搜索某一个字段,根据关键词,搜索整个文档内容。

  • 整个mapping开启all
{
"type": {
      "_all": {
         "enabled": true
      },
      "properties": {
            ... 
      }
   }
}
  • 部分字段开启all
{
   "yourtype": {
      "properties": {
         "field1": {
             "type": "text",
             "include_in_all": false
          },
          "field2": {
             "type": "text",
             "include_in_all": true
          }
      }
   }
}

  • 开启all同时保存原字段,设置store属性为true,进一步加大索引存储,需要根据需求使用。设置mapping所有字段都保存在_all中并且存储原始值:
{
   "test": {
      "_all": {
         "enabled": true,
         "store": true
      }
   }
}

doc_value

  • 是否开启doc_value,用户聚合和排序分析对not_analyzed字段,默认都是开启,分词字段不能使用,对排序和聚合能提升较大性能,节约内存,实例:"doc_value": true(缺省)| false

fielddata

  • 是否为text类型启动fielddata,实现排序和聚合分析针对分词字段,参与排序或聚合时能提高性能,不分词字段统一建议使用doc_value,实例:"fielddata": {"format": "disabled"}

store

  • 设置此字段是否从_source字段中分离,只能搜索,不能获取值,实例:"store": false(默认)| true
  • 一个field的store属性设置为true,这个会在lucene层面处理

coerce

  • 是否开启自动数据类型转换功能,比如:字符串转数字,浮点转整型,实例:"coerce: true(缺省)| false"

multifields

  • 灵活使用多字段解决多样的业务需求

dynamic

控制mapping的自动更新,实例:"dynamic": true(缺省)| false | strict

  • true:遇到陌生字段就 dynamic mapping
  • false:遇到陌生字段就忽略
  • strict:遇到陌生字段就报错

data_detection

  • 是否自动识别日期类型,实例:"data_detection":true(缺省)| false

analyzer

  • 指定分词器,默认分词器为standard analyzer,实例:"analyzer": "ik"

boost

  • 字段级别的分数加权,默认值是1.0,实例:"boost": 1.23

fields

  • 可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词,实例name自身text数据类型,映射字段keyword为keyword类型,具体如下:
{
  "userindex" : {
    "mappings" : {
      "properties" : {
        "args" : {
          "type" : "long"
        },
        "id" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

ignore_above

超过100个字符的文本,将会被忽略,不被索引,实例:"ignore_above": 100

include_in_all

设置是否此字段包含在_all字段中,默认时true,除非index设置成no,实例:"include_in_all": true

null_value

设置一些缺失字段的初始化,只有string可以使用,分词字段的null值也会被分词,实例:"null_value": "NULL"

position_increament_gap

影响距离查询或近似查询,可以设置在多值字段的数据上或分词字段上,查询时可以指定slop间隔,默认值时100,实例:"position_increament_gap": 0

search_analyzer

设置搜索时的分词器,默认跟analyzer是一致的,比如index时用standard+ngram,搜索时用standard用来完成自动提示功能,实例:"search_analyzer": "ik"

similarity

默认时TF/IDF算法,指定一个字段评分策略,仅仅对字符串型和分词类型有效,实例:"similarity": "BM25"

trem_vector

  • 默认不存储向量信息,支持参数yes(term存储),with_positions(term+位置),with_offsets(term+偏移量),with_positions_offsets(term+位置+偏移量)对快速高亮fast vector highlighter能提升性能,但开启又会加大索引体积,不适合大数据量用,实例:"trem_vector": "no"

mapping字段设置流程

  • mapping规则决定字段存储和查询方式,是Elasticsearch查询速度的关键,流程大致如下:

    1. 确定需要查询字段
    2. 每个字段类型,如字符串分词text、整型keyword,既要分词也要精确,可以设置字段为kext,映射字段为keyword
    3. 字段是否需要检索,主要设置属性,enabled:是否做搜索、聚合分析,index:是否构建倒排索引,index_option:存储倒排索引的哪些信息
    4. 是否需要排序和集合分析,分词字段使用 doc_value,不分词字段使用 fieldData
    5. 是否需要另行存储,store:true,source:false

在这里插入图片描述

总结

  • 以上收集了绝大部分Elasticsearch数据类型和mapping相关知识,方便理解和后续查阅。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值