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 |
各类型说明
字符串
类型 | 说明 |
---|---|
Elasticsearch5后不再支持,改用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 |
浮点型
类型 | 范围 |
---|---|
double | 64位双精度IEEE 754浮点类型 |
float | 32位单精度IEEE 754浮点类型 |
half_float | 16位半精度IEEE 754浮点类型 |
scaled_float | 缩放类型的的浮点数, 比如price字段只需精确到分, 57.34缩放因子为100, 存储结果为5734 |
范围数值类型
类型 | 范围 |
---|---|
integer_range | 有符号的32位整数, 范围: − 2 31 -2^{31} −231 ~ 2 31 2^{31} 231-1 |
float_range | 32位单精度IEEE 754浮点类型 |
long_range | 有符号的64位整数, 范围: − 2 63 -2^{63} −263 ~ 2 63 2^{63} 263-1 |
double_range | 64位双精度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查询速度的关键,流程大致如下:
- 确定需要查询字段
- 每个字段类型,如字符串分词text、整型keyword,既要分词也要精确,可以设置字段为kext,映射字段为keyword
- 字段是否需要检索,主要设置属性,enabled:是否做搜索、聚合分析,index:是否构建倒排索引,index_option:存储倒排索引的哪些信息
- 是否需要排序和集合分析,分词字段使用 doc_value,不分词字段使用 fieldData
- 是否需要另行存储,store:true,source:false
总结
- 以上收集了绝大部分Elasticsearch数据类型和mapping相关知识,方便理解和后续查阅。