映射也就是 Mapping,用来定义一个文档以及其所包含的字段如何被存储和索引,可以在映射中事先定义字段和数据类型、分词器等属性。
映射可以分为动态映射和静态映射。
一、动态映射:文档写入 elasticsearch中时,会根据字段的类型自动识别,这种机制成为动态映射。
Elasticsearch 自动推测字段类型规则
null =》 没有字段被添加
true or false =》 boolean类型
浮点类型数字 =》 float类型
数字 =》 long类型
JSON对象 =》 object对象
数组 =》 由数组里第一个非空值决定
string =》 有可能是date类型(开启日期检测)、double或long类型、text类型、keyword类型
可以在创建索引指定Mapping时通过 dynamic 设置来控制是否自动新增字段。
"dynamic":"true" 默认值为true,自动添加字段
"dynamic":"false" 忽略新的字段
"dynamic":"strict" 严格模式,发现新的字段抛出异常
比如:索引books的mapping设置如下,当写入的文档出现了新的字段,新字段将会被忽略,但可以写入成功。
{
"books":{
"mappings":{
"it":{
"dynamic":false,
"properties":{
"title":{"type":"text"}
"publish_date":{"type":"date"}
}
}
}
}
}
Elasticsearch碰到一个新的字符串类型的字段时,它会检查这个字符串是否包含一个可被识别的日期,如果是,会被识别为一个date类型的字段。
可以在索引的mapping设置中关闭这种日期检测机制。
"date_detection":false
二、静态映射:文档写入之前对字段的属性进行手工设置。
Elasticsearch 字段类型分为 核心类型、复合型类型、地理类型和特殊类型
核心类型分为字符串类型(string、text、keyword)、数字类型(long、integer、short、byte、double、float、half_float、scaled_float)、日期类型、布尔类型、二进制类型和范围类型;
符合类型分为数组类型(array)、对象类型(object)、嵌套类型(nested);
地理类型分为地理坐标(geo_point)、地理图形(geo_shape);
特殊类型分为IP类型、范围类型(completion)、令牌奇数类型(token_count)、附件类型(attachment)、抽取类型(percolator);
1、string 5.X 版本之后不再支持string,使用会发出警告
2、如果一个字段需要被全文搜索的,应该设置为text类型;
设置text类型之后,字段内容会被分析,在生成倒排索引之前,字符串会被分词器分成一个一个词项;
text类型的字段不用于排序。
3、类型为 keyword 的字段只能通过精确值搜索到;
keyword 类型适用于索引结构化的字段,比如主机名、状态码等;
通常用户过滤、排序、聚合。
4、数字类型:
long -2^63 至 2^63-1
integer -2^31 至 2^31-1
short -32768 至 32767
byte -128 至 127
double 64位双精度IEEE 754浮点类型
float 32位单精度IEEE 754浮点类型
half_float 16位半精度IEEE 754浮点类型
scaled_float 缩放类型的浮点数
对于float、half_float、和 scaled_float,-0.0 和 +0.0 是不同的值,使用 term 查询查找-0.0不会匹配到+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界+0.0也不会匹配-0.0;
对于数字类型的字段,在满足需求的情况下,要尽可能选择范围小的数据类型,字段的长度越短,索引和搜索的效率越高。
处理浮点数,优先考虑使用scaled_float类型, scaled_float是通过缩放因子把浮点数变成long类型。
5、JSON没有日期类型,所以Eleasticsearch可以接收如下3种形式的日期:
格式化日期的字符串,如“2015-01-01”或“2015/01/01 12:10:13”;
代表一个毫秒计时的时间戳;
代表一个秒计时的时间戳。
Elasticsearch内部存储的是毫秒计时的长整型数。
6、boolean
字段类型是布尔类型的可以接受的值为true或false。
5.4版本之前,可以接受被解释为true或false的字符串和数字;
5.4版本之后,只接受true、false、"true"、"false"。
7、binary 类型接受base64编码的字符串,默认不存储(这里的存储是指store属性取值为false)也不可搜索。
8、array
Elasticsearch没有专用的数组类型,默认情况下任何字段都可以包含一个或者多个值,但是一个数组中的值必须是同一种类型。
(1) 字符数组:["one", "two"]
(2) 整数数组:[1,2]
(3) 嵌套数组:[1,[2,3]] 或 [1,2,3]
(4) 对象数组:[{"name":"Mary","age":12},{"name":"John","age":12}]
9、object
字段内容是JSON对象
10、nested
nested 类型是 object类型中的一个特例,可以让对象数组独立索引和查询,Lucene没有内部对象的概念,所以Elasticsearch将对象层次扁平化,转化为字段名字和值构成的简单列表。
使用 nested对象类型,可以阻止elasticsearch将对象扁平化,保持数组中每个对象的独立性。
11、geo_point
geo_point 类型用于存储地理位置信息的经纬度,可以用于以下几种场景:
(1) 查找一定范围内的地理位置;
(2) 通过地理位置或者相对于中心点的距离来聚合文档;
(3) 把距离因素整合到文档的评分中;
(4) 通过距离对文档进行排序。
12、geo_ahspe
geo_shape 类型可以存储一块区域,比如矩形、三角形或其他多边形。字段的内容是一个GeoJSON格式的数据。
13、ip
ip 类型的字段可以用于存储IPv4或IPv6的地址。
14、range
range类型的使用场景包括网页中的时间选择表单、年龄范围选择表单等;range类型及其取值范围:
integer_range -2^31 至 2^31-1
float_range 32-bit IEEE754
long_range -2^63 至 2^63-1
double_range 64-bit IEEE754
date_range 64位整数,毫秒计时
15、token_count
token_count 用于统计字符串分词后的词项个数,本质上是一个整数类型。
比如:映射中指定name位text类型,增加name.length字段用于统计分词后词项的长度,类型为token_count,分词器为标准分词器,命令如下:
{
"mappings": {
"<type>": {
"properties": {
"name": {
"type": "text",
"fields": {
"length": {"type": "token_count", "analyzer":"standard"}
}
}
}
}
}
四、元字段
1、_index
多索引查询时,只需要在特定的索引名上进行查询,_index字段提供了遍历。
_index支持对索引名进行 term 查询、terms 查询、聚合分析、使用脚本和排序;
_index是一个虚拟字段,不会真的加载到Lucene索引中,可以对_index进行term、terms查询(如match、query_string、simple_query_string),但不支持perfix、wildcard、regexp和fuzzy查询。
2、_type
每条索引的文档都有一个_type字段,可以根据_type进行查询,聚合、脚本和排序。
3、_id
每条索引的文档都有一个_id字段,_id可以用于term查询、terms查询、match查询、query_string查询、simple_query_string查询,但不支持聚合、脚本和排序。
4、_uid
_uid 是_type和_id的组合,取值为{type}#{id}。可以根据_uid 进行查询,聚合、脚本和排序。
5、_all
_all 字段是把其他字段拼接在一起组成的超级字段,所有的字段内容用空格隔开,_all字段会被解析和索引,但不会被存储。
五、映射参数
1、analyzer
analyzer 参数用于指定文本字段的分词器,对索引和查询都有效。
分词器会把文本类型的内容转换为若干个词项,查询时分词器同样把查询字符串进行解析。
2、search_analyzer
search_analyzer 指定查询时的字符串分词器,查询时analyzer指定的分词器会search_analyzer被覆盖。
3、boost
boost 字段用于设置字段的权重,可以在设置mappings参数时指定也可以在查询时动态在查询参数中指定。
4、copy_to
copy_to 参数用于自定义_all字段,可以把多个字段的值复制到一个超级字段。
比如把title字段和content字段的内容合并在一起生成一个full_content字段:
{
"mappings": {
"<type>": {
"properties": {
"title": {"type":"text","copy_to":"full_content"},
"content": {"type":"text","copy_to":"full_content"},
"full_content": {"type":"text"}
}
}
}
}
5、doc_values
doc_values 参数是为了加快排序、聚合操作,在建立倒排索引的时候,额外增加一个列式存储映射,是一种空间换时间的做法,默认是开启的,对不需要聚合或者排序的字段可以关闭 doc_values节省空间。
text类型不支持 doc_values。
6、dynamic
dynamic 属性用于检测新发现的字段。
7、enabled
enabled 设置为 false的字段,Elasticsearch 会跳过字段的内容,该字段只能从 _source中获取,但是不可以被搜索,字段可以是任意类型。
8、fielddata
text字段在查询时会生成一个fielddata的数据结构,fielddata在字段首次被聚合、排序或者使用脚本的时候生成。
text字段的 fielddata 属性默认是关闭的,开启 fielddata 非常消耗内存。
索引解决的问题是“包含查询关键词的文档有哪些”,聚合解决的问题是“文档包含哪些词项”。
9、format
Elasticsearch中的data类型支持多种格式,format参数用于指定日期格式。
10、ignore_above
ignore_above 用于指定字段分词和索引的字符串最大长度,超过最大长度的值会被忽略,只用于keyword类型。
11、ignore_malformed
ignore_malformed 可以设置用于忽略不规则数据。默认是false。
如果默认字段属性的 ignore_malformed 设置为true,可以插入不符合指定type类型的内容,从而避免了因为数据类型不一致引发的错误。
12、include_in_all
include_in_all 参数用于指定字段的值是否包含在_all字段中,默认是true开启的。
13、index
index 属性指定字段是否索引,不索引也就不可搜索,取值是true或false。
14、index_options
index_options 参数控制索引时存储哪些信息到倒排索引中。
index_options参数取值
docs 只存储文档编号,默认取值
freqs 存储文档编号和词项频率
positions 存储文档编号、词项频率、词项偏移位置,词项偏移位置可用于临近搜索和短语搜索。
offsets 文档编号、词项频率、词项位置、词项开始和结束的字符位置都会被存储,offsets设置为true会使用 Postrings_highlighter。
15、null_value
值为null的字段不索引也不可以搜索,null_value参数可以让值为null的字段显示的可搜索、可索引。
也可以用于给当某个字段的内容为空时设置一个默认值。
16、fields
fields 参数可以让同一个字段有多种不同的搜索方式。