搜索引擎ElasticSearch之(5)、映射配置

映射是定义存储和索引的文档类型以及字段的过程。索引中的每一个文档都有一个类 型,每种类型都有它自己的映射。一个映射定义了文档结构内每个字段的数据类型。映射通 过配置来定义字段类型与该类型相关联的元数据的关系。
1、字段数据类型 1.1、核心数据类型 核心数据类型包括:

  • 字符串数据类型: string
  • 数字型数据类型: long 、 integer 、 short 、 byte 、 double 、 noat
  • 日期型数据类型: date
  • 布尔型数据类型: boolean
  • 二进制数据类型: binary
1.1.1、字符串数据类型
此数据类型接受文本值,可分为如下两种情况:
  • 全文本值:通常用于基于文本的相关性搜索,全文本值可以分词,在索引执行之前,通过分词器将字符串转换为单词列表,并用于后续的倒排索引构建。
  • 关键字:为精确值,通常用于过滤、排序、参与聚合等。
    字符串数据类型的参数:
参数 说明
analyzer 分词器。默认为索引的默认分词器或标准分词器
boost 字段级索引加权。接受浮点类型,默认为1.0
doc_value 定义字段是否以列跨度的方式存储在磁盘上,以便用于排序、聚合或脚本。接受true/false参数。对不分词字段,默认值为true,可分词字段不支持此参数。
fielddate 定义字段是否可以使用内存字段值进行排序、聚合或用于脚本。接受disabled或paged_bytes(默认)参数。没有分析过的字段会优先使用文档值。
ignore_above 不用索引或执行任何长于这个值的字符串。默认为0(禁用)
include_in_all 决定字段是否应该包含在_all字段中。接受true/false参数。若索引或父对象被设置为false,则字段此参数为false,其他情况为true
index 定义字段是否可以被用户搜索。接受参数为:analyzed(默认),not_analyzed或no
index_optioon 定义存储在索引中,用于搜索和突出用途的信息。
norms 计算查询得分的时候是否考虑字段长度。默认依赖于index的设置:analyzed默认为:{“enabled”:true,“loading”:“lazy”};not_analyzed默认为:{“enabled”:true}
null_value 接受一个字符串替换索引null值。默认为null,意味着字段作为缺失字段。
position_increment_gap 定义字符串数组中应该插入的虚拟索引词的数量。默认值为100,以一个较合理的值来阻止短语查询在跨字段匹配索引词的时候溢出
store 决定字段值是否应被存储以及从_score字段分布获取。接受true/false(默认)参数。
search_analyzer 指定搜索时在可分词字符串上的分词器
search_quote_analyzer 指定搜索短语时使用的分词器
similarity 指定使用的相似度评分算法,默认为TF/IDF
term_vector 定义一个可分词字段是否应该存储索引词向量。默认为no
1.1.2、数字型数据类型
数字型数据类型如下:
参数 说明
long 有符号的64位整数
integer 有符号的32位整数
short 有符号的16位整数
byte 有符号的8位整数
double 64位双精度浮点数
float 32位单精度浮点数
数字型数据类型参数:
参数 说明
coerce 试着将字符串型数据转换为整形数字数据
boost 字段级索引加权。接受浮点类型,默认为1.0
doc_value 定义字段是否以列跨度的方式存储在磁盘上,以便用于排序、聚合或脚本。接受true/false参数。对不分词字段,默认值为true,可分词字段不支持此参数。
ignore_malformed true:非法的数字将被忽略;false:非法的数字会抛出异常并丢弃整个文档
include_in_all 决定字段是否应该包含在_all字段中。接受true/false参数。若索引或父对象被设置为false,则字段此参数为false,其他情况为true
index 定义字段是否可以被用户搜索。接受参数为:analyzed(默认),not_analyzed或no
null_value 接受一个字符串替换索引null值。默认为null,意味着字段作为缺失字段。
precision_step 控制索引的额外索引词的数量来使范围查询更快速。默认值取决于数字类型
store 决定字段值是否应被存储以及从_score字段分布获取。接受true/false(默认)参数。
1.1.3、日期型数据类型
JSON无日期类型数据,Elasticsearch中的日期类型如下:
  • 包含格式化日期的字符串,如“2018-01-01”或“2018-01-01 12:30:30”。
  • 长整形类型的毫秒时间戳;
  • 整数类型的秒时间戳;
    Elasticsearch中将日期格式的数据存储为UTC毫秒的长整形。
多日期格式:
可以使用“||”分隔指定的多个日期格式。每个格式会被依次尝试,直到找到匹配的格式。
示例如下:
PUT /people { "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } }

日期类型的参数:
参数 说明
boost 字段级索引加权。接受浮点类型,默认为1.0
doc_value 定义字段是否以列跨度的方式存储在磁盘上,以便用于排序、聚合或脚本。接受true/false参数。对不分词字段,默认值为true,可分词字段不支持此参数。
ignore_malformed true:非法的数字将被忽略;false:非法的数字会抛出异常并丢弃整个文档
include_in_all 决定字段是否应该包含在_all字段中。接受true/false参数。若索引或父对象被设置为false,则字段此参数为false,其他情况为true
index 定义字段是否可以被用户搜索。接受参数为:analyzed(默认),not_analyzed或no
null_value 接受一个字符串替换索引null值。默认为null,意味着字段作为缺失字段。
precision_step 控制索引的额外索引词的数量来使范围查询更快速。默认值取决于数字类型
store 决定字段值是否应被存储以及从_score字段分布获取。接受true/false(默认)参数。
1.1.4、布尔型数据类型
布尔类型接受true/false值,也可接受代表真或假的字符串和数字。
  • 假值:false、“false”、“off”、“no”、“0”、“”、0、0.0;
  • 真值:其他任何非假的值。
布尔类型参数:
参数 说明
boost 字段级索引加权。接受浮点类型,默认为1.0
doc_value 定义字段是否以列跨度的方式存储在磁盘上,以便用于排序、聚合或脚本。接受true/false参数。对不分词字段,默认值为true,可分词字段不支持此参数。
index 定义字段是否可以被用户搜索。接受参数为:analyzed(默认),not_analyzed或no
null_value 接受一个字符串替换索引null值。默认为null,意味着字段作为缺失字段。
store 决定字段值是否应被存储以及从_score字段分布获取。接受true/false(默认)参数。
1.1.5、二进制型数据类型
二进制数据类型接受Base64编码字符串的二进制。字段不能以默认方式存储而且不能搜索。
二进制类型参数:
参数 说明
doc_value 定义字段是否以列跨度的方式存储在磁盘上,以便用于排序、聚合或脚本。接受true/false参数。对不分词字段,默认值为true,可分词字段不支持此参数。
store 决定字段值是否应被存储以及从_score字段分布获取。接受true/false(默认)参数。
1.2、复杂数据类型 复杂数据类型包括:
  • 数组数据类型:不需要专门的类型来定义数组。
  • 对象数据类型: object ,单独的 JSON 对象。
  • 嵌套数据类型: nested ,关于 JSON 对象的数组。
1.2.1、数组数据类型
Elasticsearch无专门的数组类型。每个字段默认可以包含零个或多个值,数组中的值必须都有相同的数据类型。当动态添加字段的时候,数组中第一个元素的值决定了字段类型,随后的所有值必须是相同的数据类型或者可强制转换为相同的数据类型。
数组可以包含null值,其会被null_value配置替换掉或者忽略掉。
1.2.2、对象数据类型
JSON文档时天然分层的:文档可以包含内部对象。同样内部对象也可包含内部对象。
可以明确设置字段类型为Object。
对象数据类型的参数如下:
  • dynamic:定义新的参数是否应该动态加入到已经存在的对象中。接受true(默认)、false和strict值;
  • enabled:复制给对象字段的JSON值应该被解析和索引(true,默认)或完全忽略(false);
  • include_in_all:为对象内的所有属性设置include_in_all值。对象本身不添加到_all字段。
  • properties:对象内的字段可以是任意数据类型,包括对象数据类型。新的属性可以添加到已存在的对象中。
1.2.3、嵌套数据类型
嵌套数据类型是对象数据类型中的一个专门版本,用来使一组对象被单独的索引和查询。
lucene无内部对象的概念,故Elasticsearch利用简单的列表存储字段名和值将对象层次摊平。
1.3、地理数据类型
地理数据类型包括:
  • 地理点数据类型: geo-point ,经纬点。
  • 地理形状数据类型: geo_shape ,多边形的复杂地理形状。
1.3.1、地理点数据类型
地理点数据类型值结束经纬度,可用于:
  • 查找一定范围内的地理点,此范围可以是相对于中心点一定距离数据,也可以是多边形或地理散列单元。
  • 通过地理位置或相对中心店的距离聚合文档;
  • 整合距离到文档相关性评分中;
  • 通过距离对文档进行排序;
    mapping示例:
PUT /city/_mapping { "properties":{ "location":{"type":"geo_point"}} }

设置地理位置数据:
PUT /city/_doc/1 { "name":"北京", "location":{"lat":39.124445,"lon":116.24242} }PUT /city/_doc/2 { "name":"天津", "location":"39.124445,116.24242"} }PUT /city/_doc/3 { "name":"石家庄", "location":[116.24242,39.124445] }

地理点参数:
参数 说明
coerce 试着将字符串型数据转换为整形数字数据
doc_value 定义字段是否以列跨度的方式存储在磁盘上,以便用于排序、聚合或脚本。接受true/false参数。对不分词字段,默认值为true,可分词字段不支持此参数。
geohash 定义位置点是否应该作为地理散列值在子字段.geohash中被索引。默认值为false,除非geohash_prefix参数值为true.
geohash_precision 用于geohash和geohash_prefix选项的地理散列最大长度
geohash_prefix 定义地理点是否应该作为添加前缀的地理散列来进行索引。默认false
ignore_malformed true:非法的数字将被忽略;false:非法的数字会抛出异常并丢弃整个文档
lat_lon 定义地理点是否应该在子字段.lat和.lon中被索引到。接受true和false(默认)
precision_step 控制每个经纬点被索引的额外索引词的数量。默认为16。与lat_lon参数值无关。
1.3.2、地理形状类型
地理形状数据类型有利于索引和搜索任意地理形状,如矩形和多边形。无论是数据被索引还是在查询中,都可以使用地理形状数据类型在地理点的基础上包含地理形状。
地理形状数据类型参数:
参数 默认值 说明
tree geohash 引用的前缀树名:geohash或quadtree
precision 50m 指定一个适当的精度,es会计算匹配精度的最佳tree_levels值。参数值为数字+距离单位。可用单位为:in、inch、yd、yard、mi、miled、km、kilometers、m、meters、cm、centimeters、mm、millimeters
tree_levels 前缀树层数的最大值,可用来控制形状表示的精度以及因此索引的索引词数量。
strategy recursive 定义如何在索引和搜索时表示形状。可选值为recursive和term。term仅支持点类型,recursive支持所有的形状类型。
distance_error_pct 0.025 示意前缀树应该使用的精度值。默认0.025,最大支持0.5
orientation ccw 定义多边形顶点的顺序
point_only false true:只对点形状配置地理形状类型
【搜索引擎ElasticSearch之(5)、映射配置】空间策略:
策略 支持的形状 支持的查询 多形状
recursive 所有 INTERSECTS,DISJOINT,WITHIN,CONTAINS
term INTERSECTS
GeoJSON形状格式:
GeoJSON类型 ES类型 说明
Point point 单点地理位置
LineString linestring 一个任意的线,给出两个点或更多点
Polygon polygon 一个封闭的多边形,第一个点和最后一个点必须匹配,需要N+1个顶点创建N边形,N>=4
MultiPoint multipoint 一组不连续的但可能相关的点
MultiLineString multilinestring 一组分离的线
MultiPolygon multipolygon 一组分离的多边形
GeometryCollection geometrycollection 一种类似于muti*形状的GeoJSON,多种形状可以共存
N/A envelope 一个封闭的矩形,通过指定左上角和右下角确定
N/A circle 一个圆,通过指定圆心和带单位的半径来确定,默认单位为meter
1.4、专门数据类型 专门数据类型包括:
  • IPv4 数据类型: IP 协议为 IPv4 的地址。
  • 单词计数数据类型: token_pount ,统计字符串中的单词数量。
1.4.1、IPv4数据类型
数据类型为type。
ip类型参数:
参数 说明
boost 字段级索引加权。接受浮点类型,默认为1.0
doc_value 定义字段是否以列跨度的方式存储在磁盘上,以便用于排序、聚合或脚本。接受true/false参数。对不分词字段,默认值为true,可分词字段不支持此参数。
include_in_all 决定字段是否应该包含在_all字段中。接受true/false参数。若索引或父对象被设置为false,则字段此参数为false,其他情况为true
index 定义字段是否可以被用户搜索。接受参数为:analyzed(默认),not_analyzed或no
null_value 接受一个字符串替换索引null值。默认为null,意味着字段作为缺失字段。
precision_step 控制索引的额外索引词的数量来使范围查询更快速。默认值取决于数字类型
store 决定字段值是否应被存储以及从_score字段分布获取。接受true/false(默认)参数。
1.4.2、单词计数数据类型 单词计数类型本质上是一个整数字段,接受并分析字符串值,然后索引字符串中单词的个数。
类型为:“token_count”
单词计数类型参数:
参数 说明
analyzer 分词器。默认为索引的默认分词器或标准分词器
boost 字段级索引加权。接受浮点类型,默认为1.0
doc_value 定义字段是否以列跨度的方式存储在磁盘上,以便用于排序、聚合或脚本。接受true/false参数。对不分词字段,默认值为true,可分词字段不支持此参数。
include_in_all 决定字段是否应该包含在_all字段中。接受true/false参数。若索引或父对象被设置为false,则字段此参数为false,其他情况为true
index 定义字段是否可以被用户搜索。接受参数为:analyzed(默认),not_analyzed或no
null_value 接受一个字符串替换索引null值。默认为null,意味着字段作为缺失字段。
position_step 控制索引的额外索引词的数量来使范围查询更快。默认值为32
store 决定字段值是否应被存储以及从_score字段分布获取。接受true/false(默认)参数。
2、元字段
字段 说明
_all 在一个大字符串中关联所有其他字段的值,使用空格做分隔符,可以被分析和索引但不会被存储
_field_names 索引文档中所有包含非空值的字段名称
_id 每个文档都关联一个_type和_id字段,一个索引中_type和_id唯一确定一个文档。_id没有索引,其可以从_uid字段自动生成。_id的值可以在查询及脚本中访问,但在聚合及排序的时候必须使用_uid
_index _index标识特定的索引,在term或terms查询、聚合、脚本以及排序的时候,可以访问_index字段的值。
_meta 每个类型都可以拥有自定义的元数据。这些元数据对es毫无意义,但可以用来存储应用程序的特定元数据。
_parrent 在同一个索引中通过创建映射类型可以在文档间建立父子关系
_routing 文档在索引中利用路由找到特定的分片,路由公式为:shard_num = hash(_routing) % num_primary_shards
_source _source字段包含所有是原始的json文档内容,字段本身不建立索引但会被存储,当查询的时候可以返回_source字段。_source字段会对索引产生存储开销。
_type 每个文档都包含_type和_id字段,索引_type字段的目的是通过类型名加快搜索速度
_uid _type字段与_id字段的值结合为_uid字段并被索引
3、映射参数 3.1、analyzer参数 分析器可将字符串转换为索引词。分析的过程可发生在索引及查询阶段。索引及查询时需使用相同的分析器。可以在索引或字段或查询中指定分析器。
es索引时分析器查找顺序:
  • 在字段映射中定义的分析器;
  • 在索引设置中名为default的分析器;
  • 标准分析器;
    es查询时分析器查找顺序:
  • 在查询时定义的分析器;
  • 在字段映射中定义的搜索分析器;
  • 在字段映射中定义的分析器;
  • 在索引设置中名为default_search的分析器;
  • 在索引设置中名为default的分析器;
  • 标准分析器;
3.2、boost参数 boost参数可以对一个字段进行加权,增加其在相关性计算中的得分。
在索引时最好不要进行加权:
  • 出发重新索引所有的文档,否则索引加权值不能改变;
  • 每个查询都支持加权查询,会达到同样的效果,而无需重建索引就可以灵活改变加权值;
  • 索引加权值为norm的一部分,为一个字节。这降低了字段长度归一化因子的分辨率,会导致低质量的相关性计算。
3.3、coerce参数 数据不都是标准格式的,数字可能被提供为字符串,整数可能被提供浮点数。此参数可强制转换非法值为字段的数据类型。如将字符串转换为数字,将浮点数转换为整数等。
index.mapping.coerce可以在索引级别上对所有映射类型整体上禁用强制类型转换。
3.4、copy_to参数 多个字段值可以被复制到一组字段,然后作为单个字段进行查询。
  • 字段的值时复制过来的,并不是分组;
  • 原始的_source字段不会被修改来展示复制的值;
  • 利用"copy_to":["field1","field2"]可以将相同的值复制到多个字段;
3.5、doc_value参数 反向索引允许查询请求在唯一的索引词有序列表中寻找搜索的索引词,找到之后立即访问包含索引词的文档列表。
排序、聚合以及在脚本中访问字段值需要一个不同的数据访问模式。需要能查找文档并在一个字段中寻找存在的索引词。
文档值时磁盘上的数据结构,在索引阶段创建,使上面这种数据访问模式成为可能,doc_values支持几乎索引字段类型。所有字段默认包含在文档值中,如果确定一个字段不需要排序、聚合、或者在脚本中访问字段值,可以禁用文档值来节省存储空间。
3.6、dynamic参数 dynamic控制新字段是否可以被动态添加。
  • true:新字段会被添加到映射中;
  • false:新字段会被忽略;
  • strict:如果有新字段,将会抛出异常,文档会被丢弃;
3.7、enabled参数 enabled仅可设置与映射类型和对象字段,其会导致es跳过字段值的分解,不会对其进行索引但会进行存储。
3.8、fielddata参数 3.9、format参数 用于日期类型,标识自定义的日期格式。
3.10、geohash参数 当geohash为true时,会给对应字段添加一个.geohash的子字段,其中保存着对应字段经纬度的geohash字符串值。geohash的长度由geohash_precision参数控制。当启用geohash_prefix选项,geohash选项会被字段启用。
3.11、geohash_precision参数 geohash_precision可以控制地理散列的长度,当地理散列前缀选项启用的时候,地理精度设置可以控制地理散列的最大长度。
接受参数:
  • 1至12(默认)之间的数字,代表地理散列的长度;
  • 一段距离,如1km、50m等。此时距离即为地理散列的最小分辨率。
3.12、geohash_prefix参数 geohash_prefix会索引地理位置的geohash值,并可以在地理散列单元格中查到特定地理散列的点或其相邻点。
3.13、ignore_above参数 当字符串长度大于ignore_above时,其剩余部分的字符串不会被分词或索引。主要用于部分词的字符串字段,这些字符串通常用来过滤、聚合或排序。索引这些长的结构化字段通常是不明智的。
3.14、ignore_malformed参数 默认情况下,索引错误的数据类型的时候会抛出异常并拒绝整个文档,而当ignore_malformed设置问题true时,异常会被忽略。错误字段不会被索引,但文档中的其他字段会被正常处理。
3.15、include_in_all参数 控制字段的值是否被包含在_all字段中。
3.16、index参数 index参数控制字段值如何进行索引,以及如何搜索。
  • no:不在索引中加入此字段的值,故此字段无法被搜索到;
  • not_analyzed:字段值不会被分词器进行分析,而是直接作为单个词进行索引。出字符串字段之外的索引字段默认为此选项。
  • analyzed:仅用于字符串字段上,为字符串默认选项。字符串会被分析器进行分析,解析为一组索引词,并放入倒排索引中,以便搜索的时候能被搜索到。
3.17、index_options参数 此参数控制控制将什么信息添加到反向索引中,用于搜索和强调的目的。
  • docs:只有被索引的文档数量。
  • freqs:被索引的文档数量和索引词频。索引词评论用来使重复索引词的得分高于单个索引词;
  • positions:文档数量,词频已经索引词位置。位置可用于临近或短语查询;
  • offsets:文档数量、词频、位置及开始和结束字符便宜量。
    字符串使用positions作为默认值,其他字段使用docs为默认值;
3.18、lat_lon参数 地理查询通过添加每个地理点字段的值到一个公式中,执行公式来决定地理点是否落入请求的区域中。lat_lon设为true会使经纬度的值作为数字型字段被索引。这些字段可以用于地理范围查询和地理距离查询代替执行内存运算,同时会在location.lat和location.lon字段索引地理点。
3.19、fields参数 多字段的目的是基于不同目的用不同的方法索引相同的字段。如一个字符串字段即可用于全文搜索也可用于排序或聚合。
{ "mappings":{ "properties":{ "country":{ "type":"string", "fields":{ "raw":{"type":"string","index":"not_analyzed"} } } } } }

3.20、norms参数 norms存储各种标注化系数,表示相关字段的长度和索引时相关性加强设置。将会用在查询的时候计算文档对查询条件的相关性得分。
虽norms字段对计算相关性得分很有用,但norms也需要大量内存。故如果不需要再一个特殊的字段上计算相关性得分,应该在字段上禁用norms。此种情况下字段仅用于过滤或聚合。
3.21、null_value参数 控制是不能被索引或搜索的,当一个字段设置为null,这个字段会被当做没有值的字段。null_value可以被指定的值替换掉空值,以便可以被索引和搜索。
3.22、position_increment_gap参数 为支持短语查询,需保持可分词字符串字段中分词的位置。当字符串字段索引多值,一个虚拟缺口会被加到各个值之间来防止短语查询跨之匹配。缺口大小默认为100。
3.23、precision_step参数 大多数的数字型数据类型索引额外的索引词表示每个数字的范围,使用范围查询更加便捷。
3.24、properties参数 类型映射,设置字段的数据类型等相关参数。
3.25、search_analyzer参数 设置搜索时的分析器,当未设置时使用映射中字段对应的分析器。
3.26、similarity参数 配置字段的得分算法或相似性算法。
3.27、store参数 默认情况下,字段值会被索引但不被存储,字段值会被存储在文档的_source中,如想取回单个字段或一些字段的值,而不是整个_source字段,可以通过设置store=true实现。
3.28、term_vector参数 索引词向量包含分析过程产生的索引词信息,包括:
  • 索引词列表;
  • 每个索引词的位置;
  • 映射索引词到原始字符串中原始位置的开始及结束字符偏移量;
term_vector取值如下:
  • no:不存储索引词向量;
  • yes:只存储字段的索引词;
  • with_positions:索引词和位置将会被存储;
  • with_offsets:索引词和字符偏移量会被存储;
  • with_position_offsets:索引词、位置及字符偏移量都会被存储;

    推荐阅读