Es-索引mapping详解
一、背景
在Elasticsearch中,映射指的是mapping,用来定义一个文档以及其所包含的字段如何被存储和索引,可以在映射mapping中事先定义字段的数据类型、字段的权重和分词器等属性,就类似在关系型数据库中创建字段时设置字段属性一样。
二、官方mapping构成
官方链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/coerce.html#coerce-setting
-
Dynamic mapping
-
Explicit mapping
-
runtime fields
-
field data type
-
Metadata fields
-
Mapping parameters
-
mapping limit settings
-
Removal of mapping type
三、构建mapping
- 首先确定数据格式类型
-
基本数据类型
-
text
-
keyword
-
date
-
-
复合数据类型
-
list
-
json
-
-
确定parameter参数
- 不同的数据类型有不同的基础参数
-
确定mapping限制
四、类型举例
- TEXT-全文类型
-
description
-
用于索引全文的字段,例如:电子邮件正文,商品介绍,个人简介
-
这些字段能够被分析,在被索引之前,它们通过分析器将字符串转换成单个术语列表,分析过程中允许ES在每个全文字段中搜索单个单词
-
该字段不用于排序,很少用于聚合
-
-
parameters
-
analyzer:分词器
-
指明该字段用于索引时和搜索时的分析字符串的分词器(使用search_analyzer可覆盖);
-
默认为索引分析器或标准分词器
-
-
fielddata:是否存储进fielddata
-
指明该字段是否可以使用内存中的fielddata进行排序,聚合或脚本编写?
-
排序,分组需要指定为true
-
默认值为false
-
-
fields:设置【多数类型】
-
当前text类型不够,还要设置其他类型。
-
例如:text类型字段会被分词搜索,不能用于排序,但是需要当前字段既要能通过分词搜索,又要能够排序,就要设置fields为keyword类型进行聚合排序。
-
-
index:【是否被索引】
- 设置该字段是否可以用于搜索。默认为true,表示可以用于搜索。
-
index_options: 【索引选项】用于控制在索引中哪些信息会被写入倒排索引中
-
docs:【文档号】
-
freqs:【文档号、关键词的出现词频率】,词频用于给文档进行评分,重复词的评分会高于单个词评分
-
positions:【文档号、词频、关键词的相对位置】,相对位置可用于编辑距离计算和短语查询(不分词那种)
-
offsets:【文档号、词频、关键词的相对位置、该词的起始字符串偏移量】
-
-
- keyword 关键字系列
-
description
-
keyword:主要用于 IDs、email地址、hostnames、status code、zip code 或者tags。
-
constant_keyword: 主要用于包含相同值的keyword
-
wildcard: 非结构化机器生成内容的通配符。通配符类型针对具有大值或高基数的字段进行了优化。
-
-
function
- keyword字段只能按其确切值进行搜索,通常用于过滤、排序和聚合
-
keyword:
-
description
-
不是所有的数字型数据都应该被映射为数字类型;ES优化了用于range查询的字段,例如:Integer和long;然而keyword字段更好的用于术语以及其他术语的查询。
-
标识符(如ISBN或产品ID)很少用于范围查询。然而,它们通常使用术语级查询来检索。
-
如果是以下情况,可以考虑使用keyword代替数字类型:
-
你不计划使用范围查询检索标识符数据。
-
快速检索相当重要,关键字字段上的术语查询搜索通常比数字字段上的词汇搜索更快。
-
-
-
parameters
-
doc_values
-
eager_global_ordinals:指明该字段是否加载全局序数?默认为false,不加载。 对于经常用于术语聚合的字段,启用此功能是个好主意。
-
fields:指明能以不同的方式索引该字段相同的字符串值,例如用于搜索的一个字段和用于排序和聚合的多字段
-
gnore_above:不要索引长于此值的任何字符串。默认为2147483647,以便接受所有值
-
index:指明该字段是否可以被搜索,默认为true,表示可以被搜索
-
index_options:指定该字段应将哪些信息存储在索引中,以便用于评分。默认为docs,但也可以设置为freqs,这样可以在计算分数时考虑术语频率
-
ignore_above:默认值是256,该参数的意思是,当字段文本的长度大于指定值时,不会被索引,但是会存储。即当字段文本的长度大于指定值时,聚合、全文搜索都查不到这条数据。–
-
ignore_above 最大值是 32766 ,但是要根据场景来设置,比如说中文最大值 应该是设定在10922 。
-
ignore_above背后的含义:Lucene对一个文本长度进行解析,当这个长度大于32766时,将不会进行analye行为。elasticsearch中采用字符个数来定义ignore_above值,而 Lucene 是采用byte字节。
-
象形文字字符(中文、韩文、日文): 10922 个字符(算法是: 32766 / 3).
-
Literal字符(印度文、俄文): 16383 个字符(算法是: 32766 / 2).
-
ASCII字符(a-zA-Z0-9以及~!@#$等特殊字符): 32766个字符(算法是: 32766).
-
-
-
-
-
constant_keyword
-
wildcard
- 数字类型
-
description
-
ES支持的数字类型有整型数字类型,integer类型、long类型、short类型、byte类型。浮点型数字类型 double类型、 float类型、 half_float类型、 scaled_float类型这类数据类型都是以确切值索引的,可以使用term查询精确匹配。
-
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类型)缩放因数进行缩放.
-
-
-
parameters
-
coerce:是否尝试将字符串转换为整数并截断整数的分数,默认为true,接受一个boolean值
-
doc_values:是否将该字段以逐列的方式存储在磁盘上,用于聚合和排序,默认true
-
ignore_malformed:如果为true,则忽略格式错误的数字;如果为false则格式错误的数字会抛出异常并拒绝整个文档,默认false
-
store:字段是否与_source元数据分开存储
-
meta:关于字段的元数据,附加到字段上
-
index:指明该字段是否被搜索。默认为true,表示可以被搜索
-
null_value:指明一个与该字段相同类型的值去替换掉该字段中的null。默认为null,表示该字段被视为缺失
-
scaled_float: 类型接受一个附加参数scaling_factor(特别使用)
-
-
scaled_float
- scaled_float类型需要格外注意:必须指定缩放因子scaling_factor。
* ES索引时,原始值会乘以该缩放因子并四舍五入得到新值,ES内部储存的是这个新值,但返回结果仍是原始值。 * 例如:scale\_factor为10,ES在索引时,scaled\_float字段将在内部存储2.34为23,查询时,ES都会将查询参数x10再四舍五入得到的值与23匹配,若能匹配到返回结果为2.34
五、总结
-
analyzer、search_analyzer、search_quote_analyzer的区别
[https://blog.csdn.net/qq\_39552268/article/details/118330953](https://blog.csdn.net/qq_39552268/article/details/118330953)
-
positions和offsets详解
index_positions:中的参数主要用于text类型数据进行分词,然后在检索匹配score大小和相关匹配高亮中起关键作用