ElasticSearch常用字段类型

x33g5p2x  于2021-10-17 转载在 ElasticSearch  
字(5.8k)|赞(0)|评价(0)|浏览(776)

ElasticSearch属性大全

type

ES常用的数据类型可分为3大类

  • 核⼼数据类型
  • 复杂数据类型
  • 专⽤数据类型
核心数据类型
(1)字符串

text ⽤于全⽂索引,搜索时会自动使用分词器进⾏分词再匹配(可以指定ik分词器)

会分词,然后进行索引
支持模糊、精确查询
不支持聚合
*
keyword 不分词,搜索时需要匹配完整的值

不进行分词,直接索引
支持模糊、精确查询
支持聚合

需要分词使用text类型(不能使用聚合会报错),否则使用keyword类型。

注意: 当一个字段需要按照精确值进行过滤、排序、聚合等操作时, 就应该使用keyword类型.keyword的内容不会被分词, 可以设置是否需要存储: “index”: “true|false”.

一定要注意这个配置,一旦设置了text那么之后就无法使用聚合了,

主要还是看公司,对ES的理解,如果ES当做数据库的话那么尽量就别使用text,因为一旦业务复杂的话需要用到聚合就完蛋了.

如果公司只是拿ES做搜索的话基本上只要是字符串类型的都是使用text然后加ik分词器

(2)数值型
  • 整型: byte,short,integer,long
  • 浮点型: float, half_float, scaled_float,double

long:有符号64-bit integer:-2^63 ~ 2^63 - 1

integer:有符号32-bit integer,-2^31 ~ 2^31 - 1

short:有符号16-bit integer,-32768 ~ 32767

byte: 有符号8-bit integer,-128 ~ 127

double:64-bit IEEE 754 浮点数

float:32-bit IEEE 754 浮点数

half_float:16-bit IEEE 754 浮点数

scaled_float

(3)日期类型
  • date
    json没有date类型,插入|更新文档|字段时怎么表示date类型?

mapping,将字段类型设置为date “type” : “date”

/#插入|更新此字段的值时,有3种表示方式

/#使用固定格式的字符串 “2020-04-18”、“2020/04/18 09:00:00”

/#值使用长整型的时间戳,(s) 1610350870

/#值使用长整型的时间戳,(ms) 1641886870000

"properties": {
            "time": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
                "index": true
            }
        }

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html 官方的时间格式化大全

(4)范围型
  • integer_range, long_range, float_range,double_range,date_range
    比如招聘要求年龄[20, 40],mapping:

age_limit :{

“type” : “integer_range”

}

插入|更新文档|字段时,值写成json对象的形式:

“age_limit” : {

“gte” : 20,

“lte” : 40

}

gt是大于,lt是小于,e是equals等于

age_limit的区间包含了此值的文档都算是匹配。

按此字段搜索时,值写常量:

“term” : {

“age_limit” : 30

}

(5)布尔
  • boolean /#true、false
(6⼆进制
  • binary 会把值当做经过 base64 编码的字符串,默认不存储,且不可搜索
复杂数据类型
(1)对象
  • object
    /#定义mapping

“user” : {

“type”:“object”

}

/#插入|更新字段的值,值写成json对象的形式

“user” : {

“name”:“chy”, “age”:12

}

提示: 一个对象中可以嵌套对象

/#搜索时,字段名使用点号连接

“match”:{

“user.name”:“chy”

}

(2)数组

字符串数组 [ “one”, “two” ]

整数数组 [ 1, 2 ]

数组的数组 [ 1, [ 2, 3 ]],相当于 [ 1, 2, 3 ]

Object对象数组 [ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }]

同一个数组只能存同类型的数据,不能混存,譬如 [ 10, “some string” ] 是错误的

数组中的 null 值将被 null_value 属性设置的值代替或者被忽略

空数组 [] 被当做 missing field 处理
/#ES没有专门的数组类型,定义mapping,写成元素的类型
“arr” : {
“type”:“integer”
}

/#插入|更新字段的值。元素可以是各种类型,但元素的类型要相同
“arr” : [1,3,4]

(3)嵌套类型 Nested

nested 类型是一种对象类型的特殊版本,它允许索引对象数组,独立地索引每个对象

专用数据类型
(1)ip

/#定义mapping
“ip_address” : {
“type”:“ip”
}

/#插入|更新字段的值,值写成字符串形式
“ip” : “192.168.1.1”

/#搜索
“match”:{
“ip_address”:“192.168.1.1”
}

/#ip在192.168.0.0 ~ 192.168.255.255上的文档都匹配
“match”:{
“ip_address”:“192.168.0.0/16”
}

(2)实现自动补全 completion
(3)记录分词数 token_count
(4)记录字符串hash值 murmur3
(5)Percolator
地理位置数据类型
(1)geo_point

地理位置,其值可以有如下四中表现形式:
object对象:“location”: {“lat”: 41.12, “lon”: -71.34}
字符串:“location”: “41.12,-71.34”
geohash:“location”: “drm3btev3e86”
数组:“location”: [ -71.34, 41.12 ]

(2)geo_shape

analyzer和search_analyzer

  • 分析器主要有两种情况会被使用,一种是插入文档时,将text类型的字段做分词然后插入倒排索引,第二种就是在查询时,先对要查询的text类型的输入做分词,再去倒排索引搜索
  • 如果想要让索引和查询 时使用不同的分词器,ElasticSearch也是能支持的,只需要在字段上加上search_analyzer参数
  1. 在索引时,只会去看字段有没有定义analyzer,有定义的话就用定义的,没定义就用ES预设的
  2. 在查询时,会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义,才会去使用ES预设的

查询和插入都使用一样的分词器

"like":{
        "type":"text",
        "analyzer": "ik_max_word",
        "index": true
      }

查询和插入分别使用不同的分词器 (如果查询压力比较大的话可以将查询使用最少切分)

"like":{
        "type":"text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "index": true
      }

boost

  • 字段权重,默认为1.0

dynamic

  • Mapping中的字段类型一旦设定后,禁止直接修改,原因是:Lucene实现的倒排索引生成后不允许修改

  • 只能新建一个索引,然后reindex数据

  • 默认允许新增字段

  • 通过dynamic参数来控制字段的新增:

  • true(默认)允许自动新增字段

  • false 不允许自动新增字段,但是文档可以正常写入,但无法对新增字段进行查询等操作

  • strict 文档不能写入,报错

copy_to

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

index

  • 控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可搜索 (数据不索引只存储)

index_options

  • index_options参数控制将哪些信息添加到倒排索引,以用于搜索和突出显示,可选的值有:docs,freqs,positions,offsets
  • docs:只索引 doc id
  • freqs:索引 doc id 和词频,平分时可能要用到词频
  • positions:索引 doc id、词频、位置,做 proximity or phrase queries 时可能要用到位置信息
  • offsets:索引doc id、词频、位置、开始偏移和结束偏移,高亮功能需要用到offsets

fielddata

  • 是否预加载 fielddata,默认为false
  • Elasticsearch第一次查询时完整加载这个字段所有 Segment 中的倒排索引到内存中
  • 如果我们有一些 5 GB 的索引段,并希望加载 10 GB 的 fielddata 到内存中,这个过程可能会要数十秒
  • 将 fielddate 设置为 true ,将载入 fielddata 的代价转移到索引刷新的时候,而不是查询时,从而大大提高了搜索体验
  • 参考:预加载 fielddata

eager_global_ordinals

  • 是否预构建全局序号,默认false
  • 参考:预构建全局序号(Eager global ordinals)

doc_values

fields

  • 该参数的目的是为了实现 multi-fields
  • 一个字段,多种数据类型
  • 譬如:一个字段 city 的数据类型为 text ,用于全文索引,可以通过 fields 为该字段定义 keyword 类型,用于排序和聚合

format

由于JSON没有date类型,Elasticsearch预先通过format参数定义时间格式,将匹配的字符串识别为date类型,转换为时间戳(单位:毫秒)
*
format默认为:strict_date_optional_time||epoch_millis
*
Elasticsearch内建的时间格式:

上述名称如果加前缀 strict_ 表示为严格格式
*
更多的查看文档

properties

用于_doc,object和nested类型的字段定义子字段

{
  "mappings": {
    "_doc": { 
      "properties": {
        "manager": { 
          "properties": {
            "age":  { "type": "integer" },
            "name": { "type": "text"  }
          }
        },
        "employees": { 
          "type": "nested",
          "properties": {
            "age":  { "type": "integer" },
            "name": { "type": "text"  }
          }
        }
      }
    }
  }
}

normalizer

  • 与 analyzer 类似,只不过 analyzer 用于 text 类型字段,分词产生多个 token,而 normalizer 用于 keyword 类型,只产生一个 token(整个字段的值作为一个token,而不是分词拆分为多个token)

coerce

  • 强制类型转换,把json中的值转为ES中字段的数据类型,譬如:把字符串"5"转为integer的5
  • coerce默认为 true
  • 如果coerce设置为 false,当json的值与es字段类型不匹配将会 rejected
  • 通过 “settings”: { “index.mapping.coerce”: false } 设置索引的 coerce

enabled

  • 是否索引,默认为 true
  • 可以在_doc和字段两个粒度进行设置

ignore_above

  • 设置能被索引的字段的长度
  • 超过这个长度,该字段将不被索引,所以无法搜索,但聚合的terms可以看到

null_value

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

ignore_malformed

  • 当数据类型不匹配且 coerce 强制转换时,默认情况会抛出异常,并拒绝整个文档的插入
  • 若设置该参数为 true,则忽略该异常,并强制赋值,但是不会被索引,其他字段则照常

norms

  • norms 存储各种标准化因子,为后续查询计算文档对该查询的匹配分数提供依据
  • norms 参数对评分很有用,但需要占用大量的磁盘空间
  • 如果不需要计算字段的评分,可以取消该字段 norms 的功能

position_increment_gap

与 proximity queries(近似查询)和 phrase queries(短语查询)有关
*
默认值 100
*

similarity

  • 设置相关度算法,ES5.x 和 ES6.x 默认的算法为 BM25
  • 另外也可选择 classic 和 boolean

store

  • store 的意思是:是否在 _source 之外在独立存储一份,默认值为 false
  • es在存储数据的时候把json对象存储到"_source"字段里,"_source"把所有字段保存为一份文档存储(读取需要1次IO),要取出某个字段则通过 source filtering 过滤
  • 当字段比较多或者内容比较多,并且不需要取出所有字段的时候,可以把特定字段的store设置为true单独存储(读取需要1次IO),同时在_source设置exclude
  • 关于该字段的理解,参考: es设置mapping store属性

term_vector

  • 与倒排索引相关

相关文章