Mapping数据类型

text类型,支持全文搜索,因为text涉及分词,所以可以配置使用什么分词器,尤其涉及中文分词,这些涉及全文搜索的内容
实际项目中,如果不需要模糊搜索的字符类型,可以选择keyword类型,例如:手机号、email、微信的openid等等,如果选text类型,可能会出现搜出一大堆相似的数据,而且不是精确的数据。
 
dynamic mapping:没有预先定义文档的映射(数据类型),也可以插入数据,因为ES默认会自动检测我们插入的数据的类型,相当于自动定义文档类型(mapping)。自动映射的缺点就是会出现ES映射的数据类型,不是我们想要的类型,例如:手机号,我们希望是一个精确值,使用keyword类型,ES映射成为了text类型,这就不符合业务预期了。
一级分类
二级分类
具体类型
核心类型
字符串类型
string,text,keyword
整数类型
integer,long,short,byte
浮点类型
double,float,half_float,scaled_float
逻辑类型
boolean
日期类型
date
范围类型
range(Integer_range,long_range,date_range...)
二进制类型
binary (BASE64 的二进制)
复合类型
数组类型
array
对象类型
object
嵌套类型
nested
地理类型
地理坐标类型
geo_point
地理地图
geo_shape
特殊类型
IP类型
ip
...
...
...
字符串类型
从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代:
  • text 类型适用于需要被全文检索的字段,因为它会分词,例如新闻正文、邮件内容等比较长的文字,text 类型会被 Lucene 分词器(Analyzer)处理为一个个词项,并使用 Lucene 倒排索引存储,text 字段不能被用于排序,如果需要使用该类型的字段只需要在定义映射时指定 JSON 中对应字段的 type 为 text。text 类型详细可参考:Text type family | Elasticsearch Guide [7.17] | Elastic
总结:对text类型的字段,会先使用分词器分词,生成倒排索引,用于之后的搜索。对keyword类型的字段,不会分词,搜索时只能精确查找
关于text类型的常用参数:
  • analyzer:指明该字段用于索引时和搜索时的分析字符串的分词器(使用search_analyzer可覆盖它)。 默认为索引分析器或标准分词器
  • fielddata:指明该字段是否可以使用内存中的fielddata进行排序,聚合或脚本编写?默认值为false,可取值true或false。(排序,分组需要指定为true)
  • fields:【多数类型】text类型字段会被分词搜索,不能用于排序,而当字段既要能通过分词搜索,又要能够排序,就要设置fields为keyword类型进行聚合排序。
  • index:【是否被索引】设置该字段是否可以用于搜索。默认为true,表示可以用于搜索。
  • search_analyzer:设置在搜索时,用于分析该字段的分析器,默认是【analyzer】参数的值。
  • search_quote_analyzer:设置在遇到短语搜索时,用于分析该字段的分析器,默认是【search_analyzer】参数的值。
  • index_options:【索引选项】用于控制在索引过程中哪些信息会被写入到倒排索引中
    • docs:只索引文档号到倒排索引中,但是并不会存储
    • freqs:文档号和关键词的出现频率会被索引,词频用于给文档进行评分,重复词的评分会高于单个次评分
    • positions:文档号、词频和关键词 term 的相对位置会被索引,相对位置可用于编辑距离计算和短语查询(不分词那种)
    • offsets:文档号、词频、关键词 term 的相对位置和该词的起始字符串偏移量
关于keyword类型的常用参数:
  • eager_global_ordinals:指明该字段是否加载全局序数?默认为false,不加载。 对于经常用于术语聚合的字段,启用此功能是个好主意。
  • fields:指明能以不同的方式索引该字段相同的字符串值,例如用于搜索的一个字段和用于排序和聚合的多字段
  • ignore_above:不要索引长于此值的任何字符串。默认为2147483647,以便接受所有值
  • index:指明该字段是否可以被搜索,默认为true,表示可以被搜索
  • index_options:指定该字段应将哪些信息存储在索引中,以便用于评分。默认为docs,但也可以设置为freqs,这样可以在计算分数时考虑术语频率
  • norms:在进行查询评分时,是否需要考虑字段长度,默认为false,不考虑
  • ignore_above:默认值是256,该参数的意思是,当字段文本的长度大于指定值时,不会被索引,但是会存储。即当字段文本的长度大于指定值时,聚合、全文搜索都查不到这条数据。ignore_above 最大值是 32766 ,但是要根据场景来设置,比如说中文最大值 应该是设定在10922 。
数字类型
ES支持的数字类型有整型数字类型,integer类型、long类型、short类型、byte类型。浮点型数字类型 double类型、 float类型、 half_float类型、 scaled_float类型这类数据类型都是以确切值索引的,可以使用term查询精确匹配。数字类型的字段在满足需求的前提下应当尽量选择范围较小的数据类型,字段长度越短,搜索效率越高,对于浮点数,可以优先考虑使用 scaled_float 类型,该类型可以通过缩放因子来精确浮点数,例如 12.34 可以转换为 1234 来存储。
  • long带符号的64位整数,最小值-263,最大值263-1
  • integer带符号的32位整数,最小值-231,最大值231^-1
  • short带符号的16位整数,最小值-32768,最大值32767
  • byte带符号的8位整数,最小值-128,最小值127
  • double双精度64位IEEE 754 浮点数
  • float单精度32位IEEE 754 浮点数
  • half_float半精度16位IEEE 754 浮点数
  • scaled_float带有缩放因子的缩放类型浮点数,依靠一个long数字类型通过一个固定的(double类型)缩放因数进行缩放
日期类型
在 ES 中日期可以为以下形式:格式化的日期字符串,例如 2020-03-17 00:00、2020/03/17时间戳(和 1970-01-01 00:00:00 UTC 的差值),单位毫秒或者秒即使是格式化的日期字符串,ES 底层依然采用的是时间戳的形式存储。
日期类型一般会结合一个mapping参数来使用:format——自定义的日期格式,默认:strict_date_optional_time || epoch_millis。
布尔类型
JSON 文档中同样存在布尔类型,不过 JSON 字符串类型也可以被 ES 转换为布尔类型存储,前提是字符串的取值为 true 或者 false,布尔类型常用于检索中的过滤条件。
二进制类型
二进制类型 binary 接受 BASE64 编码的字符串,默认 store 属性为 false,并且不可以被搜索。
范围类型
范围类型可以用来表达一个数据的区间,所以会用到gt、gte、lt、lte…等逻辑表示符。可以分为6种:integer_range、float_range、long_range、double_range、date_range以及ip_range。
  • integer_range,带符号的32位整数区间,最小值-231,最大值231-1
  • long_range,带符号的64位整数区间,最小值-263,最小值263-1
  • float_range,单精度32位IEEE 754浮点数区间
  • double_range,双精度64位IEEE 754浮点数区间
  • date_range,日期值范围,表示为系统纪元以来经过的无符号64位整数毫秒
  • ip_range,支持IPv4或IPv6(或混合)地址ip值范围
对象类型
对象类型即一个JSON对象,JSON 字符串允许嵌套对象,所以一个文档可以嵌套多个、多层对象。可以通过对象类型来存储二级文档,不过由于 Lucene 并没有内部对象的概念,所以ES 会将原 JSON 文档扁平化,例如有下面这样的文档:
上面我们看到都是一个个分开的字段,而实际上 ES 会将其转换为以下格式,并通过 Lucene 存储,即使 name 是 object 类型:
所以我们在进行条件搜索是也必须使用这种方式:
嵌套类型
嵌套类型可以看成是一个特殊的对象类型,在文档属性是一个对象数组时使用,它允许对象数组彼此独立地编制索引和查询,例如文档:
username 字段是一个 JSON 数组,并且每个数组对象都是一个 JSON 对象。如果将 username 设置为对象类型,那么 ES 会将其转换为:
可以看出转换后的 JSON 文档中 first 和 last 的关联丢失了,如果尝试搜索 first 为 li,last 为 wu 的文档,那么成功会检索出上述文档,但是 li 和 wu 在原 JSON 文档中并不属于同一个 JSON 对象,应当是不匹配的,即检索不出任何结果。而嵌套类型就是为了解决这种问题的,嵌套类型将数组中的每个 JSON 对象作为独立的隐藏文档来存储,每个嵌套的对象都能够独立地被搜索。
测试查询:
 
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP