欢迎访问我的博客,你的支持,是我最大的动力!

elasticsearch技术解析与实战(二) 映射

ELK Stack 小马奔腾 8910℃ 评论
目录:
[显示]

本文是《Elasticsearch技术解析与实战》的笔记,该书基于es2.3.0

映射

映射是定义存储和索引的文档类型以及字段的过程。即定义每个字段的数据类型。

概念
1、映射类型
每个索引有一个或多个映射类型,用来在索引中将文档划分为不同的逻辑组
元字段:定义如何处理文档无数据,包括_index字段、_type字段、_id字段、_source字段
字段或属性:同一索引中不同映射类型的相同名称字段必须拥有相同的映射2、字段数据类型
简单数据类型:字符串string、日期date、长整型long、双精度浮点型double、布尔型boolean、IP、integer
JSON的层次性类型:对象object、嵌套nested、地理点geo_point、地理形状geo_shape
一个数据类型通过fields参数支持多字段3、动态映射
动态映射可以配置自定义映射用于新类型或者新字段4、显式映射
相对于动态映射5、更新当前映射
除了记录之外,现有的映射类型和字段不能更新,修改映射意味着放弃已经索引的文档,好的做法是根据映射创建新的索引并且重新索引数据6、映射类型之间共享字段
映射类型在每个索引中是唯一的,一个索引中不同type中只要是同名的field则映射类型相同,但参数可以不同,如copy_to参数、dynamic参数、enabled参数、ignore_above参数、include_in_all参数
当产生类型冲突时,可以选择使用更详细的命名7、映射示例
PUT secisland
{"mappings":{"user":{"_all":{"enabled":false},"properties":{"title":{"type":"string"},"name":{"type":"string"},"age":{"type":"integer"}}},"blogpost":{"properties":{"title":{"type":"string"},"body":{"type":"string"},"user_id":{"type":"string","index":"not_analyzed"},"created":{"type":"date","format":"strict_date_optional_time||epoch_millis"}}}}}
user映射类型取消元字段_all
字段数据类型

核心数据、复杂数据、地理数据、专门数据

核心数据类型
字符串:string
数字:long、integer、short、byte、double、float
日期:date
布尔:boolean
二进制:binary
复杂数据类型
数组:不需要专门的类型来定义数组
对象:object,单独的JSON对象
嵌套:nested,关于JSON对象的数组
地理数据类型
地理点:geo_point,经纬点
地理形状:geo_shape,多边形复杂地理形状
专门数据类型
IPv4:IP
完成数据:completion,提供自动补全的建议
单词计数:token_count,统计字符串中的单词数量
核心数据类型

字符串

授受文本值
全文本:可以分词,不用于排序且很少用于聚合
关键字:精准值,常用于过滤、排序、参与聚合。不参与分词
PUT secisland {"mappings":{"secilog":{"properties":{"full_name":{"type":"string"},"status":{"type":"string","index":"not_analyzed"}}}}}
其中full_name是全文本、status是关键字
通过多字段,可以让同一个字段同时拥有全文本和关键字两个版本
字符串数据类型字段可授受的参数:

参数 说明
analyzer 分词器,用于可分词字段。默认为默认的索引分词器或者标准分词器
boost 字段级索引加权。授受浮点型数字,默认为1.0
doc_values 定义字段是否应该以列跨度的方式存储在磁盘,以便用于排序、聚合或者脚本。接受true或false。对于不可分词字段默认为true,可分词字段不支持该参数
fielddate 决定字段是否可以使用内存字段进行排序、聚合或在脚本中使用。接受disabled或paged_bytes(默认)。没有分析过的字段会优先使用文档值
ignore_above 不索引或执行任何长于这个值的字符串。默认为0(禁用)
include_in_all 决定字段是否包含在_all字段中。接受true或false。如果索引被设置为no或父对象字段设置为include_in_all为false。默认为false;其它情况下默认为true
index 决定字段是否可以被用户搜索,接受参数analyzed(默认,视为全文本),not_analyzed(关键字)以及no
index_options 定义存储在索引中,用于搜索和突出用途的信息
norms 计算查询得分的时候是否应该考虑字段长度。默认依赖于索引设置:analyzed字段默认为{"enabled":true,"loading":"lazy"},
not_analyzed默认为{"enabled":false}
null_value 接受一个字符串值替换所有null值,默认为null,意味着字段做为缺失字段。如果字段是可分词的,null_value也会被分词
position_
increment_gap
定义字符串数组中应该插入的虚拟索引词的数量。默认为100,以一个较合理的值来阻止短语查询在跨字段匹配索引词时候的溢出
store 决定字段值是否应该被存储以及从_source字段分别获取。接受true或false(默认)
search_analyzer 用在可分词字段上的分词器
search_quote_
analyzer
指定搜索短语时使用的分词器
similarity 指定使用相似度评分算法,默认为TF/IDF
term_vector 定义一个可分词字段是否应该存储索引词向量,默认no

数字型

参数 说明
long 有符号64位整数,-2^63至2^63-1
integer 有符号32位整数,-2^31至2^31-1
short 有符号16位整数,-32768至32767
byte 有符号8位整数,-128至127
double 64位双精度浮点数
float 32位单精度浮点数

PUT secisland
{"mappings":{"secilog":{"properties":{"number_of_bytes":{"type":"integer"},"time_in_seconds":{"type":"float"}}}}}
数字型字段参数

参数 说明
coerce 试着将字符串转换为整数型数字
boost 字段级索引加权,接受浮点型数字参数,默认为1.0
doc_values 定义字段是否以列跨度的方式存储在磁盘上,以便于排序、聚合或脚本。接受true或false
ignore_malformed  为true时,畸形的数字会被忽略;如果false(默认),畸形数字会抛出异常并丢弃整个文档
include_in_all 决定字段是否应该包含在_all字段中。接受true或false。如果索引被设置为no或父对象字段设置为include_in_all为false。默认为false;其它情况下默认为true
 index 决定字段是否可以被搜索。接受参数not_analyzed(默认)和no
null_value 接受与字段同类型的数字型值来代替null值。默认是null,意味着字段作为缺失字段
precision_step 控制索引的额外索引词的数量来使范围查询更快速。默认值取决于数字类型
store 决定字段值是否应该存储以及从_source字段分别获取。接受true或false

日期型

JSON没有日期型数据类型,所以es中日期可以是:
包含格式化日期的字符串:"2018-01-01","2018/01/01 12:00:00"
代表时间毫秒数的长整型数字
代表时间秒数的整数
通常,日期被转换为UTC(如果时区被指定)存储为代表时间毫秒数的长整数
可以自定义时间格式,如果没有指定格式,则使用默认值:"strict_date_optional_time||epoch_millis"
{"mappings":{"secilog":{"properties":{"date":{"type":"date"}}}}}这将支持"2018-01-01","2018-01-01T12:00:00Z",1420070400001这些形式
多日期格式
使用||分隔,可以指定多个日期格式。每个格式会被依次尝试,直到匹配的格式
{"type":"date","format":"yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"}
字段参数

布尔型

接受true或者false,也可以接受代表真或者假的字符串和数字
假值:false,"false","off","no","0",""空字符串,0,0.0
真值:其他任何非假的值
{"type":"boolean"}
索引词聚合之类的聚合使用1和0作为key,使用字符串"true"和"false"作为key_as_string。使用脚本时,布尔字段返回1和0。

二进制

接受Base64编码字符串的二进制值。字段不以默认方式存储而且不能搜索
{"type":"binary"}
Base64编码二进制值不能嵌入换行符\n字符参数:
doc_values 定义字段是否应该以列跨度的方式存储在磁盘上,以便于排序、聚合或者脚本。接受true(默认)或false
store 决定字段值是否应该存储以及从_source字段分别获取。接受true或false(默认)
复杂数据类型

数组数据类型

每个字段默认可以包含零个或更多的值,但数组中所有的值都必须是相同的数据类型,如
字符串数组:["one","two"]
整数数组:[1,2]
由数组组成的数组:[1,[2,3]],等同于[1,2,3]
对象数组:[{"name":"Mary","age":12},{"name":"John","age":10}]
注意,无法对数组中的每一个对象进行单独的查询
当动态添加字段时,数组中第一个元素的值决定了字段类型,后面的所有值必须是相同的数据类型或者可以强制转换为相同的数据类型
es不支持混合数据类型的数组,如[10,"some string"]
数组可能包含null值,会被null_value配置替换或者忽略掉。一个空数组[]被当作缺失字段(没有值的字段)

对象数据类型

JSON是天然分层的,文档可以包含内部对象,内部对象还可以包含内部对象
{"region":"US","manager":{"age":30,"name":{"first":"John","last":"Smith"}}}
本质上,文档被简单地索引为键值对列表:
{"region":"us",
"manager.age":30,
"manager.name.first":"John",
"manager.name.last":"Smith"}
映射为:
{"mappings":{"secilog":{"properties":{"region":{"type":"string","index":"not_analyzed"},"manager":{"properties":{"age":{"type":"integer"},"name":{"properties":{"first":{"type":"string"},"last":{"type":"string"}}}}}}}}}
映射类型是一种对象类型,拥有参数字段。manager字段是一个内部对象字段,manager.name字段是manager字段中的内部对象字段。可以明确的设置type字段为object(默认值)。对象数据类型参数
dynamic 定义新的参数是否应该动态加入到已经存在的对象中。接受true(默认),false和strict
enabled 赋值给对象字段的JSON值应该被解析和索引(true,默认),还是完全忽略false
include_in_all 为对象内所有属性设置include_in_all值。对象本身不添加到_all字段
properties 对象内的字段可以是任意数据类型,包括对象数据类型。新的属性可以添加到已存在的对象中

嵌套数据类型

对象数据类型的一个专门版本,用来使一组对象被单独索引和查询
对象数组摊平,可能会引起关联性的丢失,要解决这个问题,可以使用嵌套数据类型
要对一组对象进行索引且保留数组中每个对象的独立性,应该使用嵌套数据类型而不是对象数据类型
嵌套数据类型将数组中每个对象作为分离出来的隐藏文档进行索引,意味着每个嵌套对象可以独立于其他对象被查询
PUT secisland {"mappings":{"secilog":{"properties":{"user":{"type":"nested"}}}}}
插入数据
PUT secisland/secilog/1 {"group":"fans","user":[{"first":"John","last":"Smith"},{"first":"Alice","last":"White"}]}
这时可以根据对象进行搜索,但对象条件要全匹配才能搜索到
POST secisland/_search {"query":{"nested":{"path":"user","query":{"bool":{"must":[{"match":{"user.first":"Alice"}},{"match":{"user.last":"White"}}]}}}}}嵌套数据类型字段参数
dynamic 定义新的参数是否应该动态加入到已经存在的对象中,接受true(默认),false,strict
include_in_all 设置所有嵌套对象属性的include_in_all值。嵌套文档没有它自身的_all字段,取而代之的是,值被添加到"根"文档的_all字段中
properties 嵌套对象的字段可以是任何数据类型,包括嵌套对象类型。新的属性可以被添加到已经存在的嵌套对象中。
地理数据类型

地理点数据类型

经纬度对
查找一定范围内的地理点,范围可以是相对于一个中心点的固定距离或者多边形或者地理散列单元
通过地理位置或者相对于中心点的距离聚合文档
整合距离到文档的相关性评分
通过距离对文档进行排序
PUT secisland {"mappings":{"seciclog":{"properties":{"location":{"type":"geo_point"}}}}}
存储地理位置有4种方式,顺序为经度、纬度
POST secisland/secilog/1 {"text":"Geo_point as an object","location":{"lat":41.12,"lon":-71.34}}
POST secisland/secilog/3 {"text":"Geo_point as string","location":"41.12,-71.22"}
POST secisland/secilog/4 {"text":"Geo_point as geohash","location":"drm3btev3e86"}
POST secisland/secilog/5 {"text":"Geo_point as array","location":[-71.45,41.34]}

地理形状数据类型

索引和搜索任意地理形状,在地理点的基础上包含地理形状
地理形状映射将geo_json几何对象映射成地理形状
前缀树:形状转换成一系列表示为方格(栅格)的散列用于实现一个前缀树。可以为多层网络,对应为不同的精度,提高地图缩放级别
空间策略:前缀树的实现基于空间策略来分解提供的形状为近似方格

准确性:地理形状不提供100%的准确性,且取决于匹配值。可能对确实的查询返回一些误判或者漏判,为缓和这种情况,需要为tree_levels参数选择一个合适的值来适应相应的预期
{"properties":{"location":{"type":"geo_shape","tree":"quadtree","precision":"1m"}}}
上面这个映射将location映射到地理形状类型,使用quad前缀树且精度为1m。es转换这个精度到tree_levels 26
性能考虑:索引大小和合理水平的精确值的折中是50m
输入结构:
示例:
Point是单独的坐标点,如建筑的位置或者智能手机地理定位接口提供的确切位置
{"location":{"type":"point","coordinates":[-77.03653,38,897676]}}
Linestring通过两个或更多的一组位置定义。只指定两个点时,表示一条直线;指定更多的点,可以创建任意的线
{"location":{"type":"linestring","coordinates":[[-77.03653,38.897676],[-77.009051,38.889939]]}}
Polygon通过一列地理点列表进行定义。每个列表中的第一个点和最后一个点必须相同,多边形必须是封闭的
{"location":{"type":"polygon","coordinates":[[[100.0,0.0],[101.0,0.0],[101.0,1.0],[100.0,1.0],[100.0,0.0]]]}}
#第一个数组表示外环边界,其他数组表示内部形状(孔)
#外环:逆时针方向  内环/孔:顺时针方向
#orientation参数可以声明顶点的顺序,可以在映射中定义,也可以在文档中被重写:"orientation":"clockwise"
MultiPoint是GeoJSON点的列表
MultiLineString是GeoJSON线的列表
MultiPolygon是GeoJSON多边形的列表
GeometryCollection是GeoJSON地理几何对象的集合
Envelope包含矩形左上角和右下角的坐标值
Circle包含圆心和半径
{"location":{"type":"circle","coordinates":[-45.0,45.0],"radius":"100m"}}
地理形状值只能通过_source字段取回
专门数据类型

IPv4数据类型

本质上是一个长整形字段
PUT secisland {"mappings":{"secilog":{"properties":{"ip_addr":{"type":"ip"}}}}}
POST secisland/secilog/1 {"ip_addr":"192.168.1.1"}

单词计数数据类型

本质上是一个整数型字段,授受并分析字符串值,然后索引字符串中单词的个数
PUT secisland {"mappings":{"secilog":{"properties":{"name":{"type":"string","fields":{"length":{"type":"token_count","analyzer":"standard"}}}}}}}
插入数据:POST secisland/secilog/1 {"name":"John Smith"}
单词计数类型计算位置增量而不是统计单词,所以即使过滤掉一部分单词,它们也包含在计数中
元字段

元字段是为保证系统正常运转的内置字段,以下划线开头。当映射类型被创建时,可以自定义一些元字段,如标识元字段/文档来源元字段/索引元字段/路由元字段等

_all字段
一个特殊的包含全部内容的字段,在一个大字符串中关联所有其他字段的值,使用空格作为分割符,可以被分析和索引,但是不被存储
使用_all可以对文档的值进行搜索而不必知道包含所需值的字段名
PUT secisland/secilog/1 {"first_name":"John","last_name":"Smith","date_of_birth":"1970-10-24"}
利用_all搜索
POST secisland/_search {"query":{"match":{"_all":"john smith 1970"}}}
_all字段包含索引词["john","smith","1970","10","24"]。date_of_birth会索引一个索引词1970-10-24 00:00:00UTC,但是在_all字段中日期值只作为三个字符串被索引"1970","10","24"
_all字段是一个字符串类型字段,接受与字符串字段相同的参数,包括analyzer,index_options,store
_all字段关联字段值时,丢弃了短字段与长字段的区别,所以当相关性是重要搜索条件时,应该指明查询字段,而不是使用_all
_all字段的使用会需要额外的处理器周期和磁盘空间,所以如果不需要的话,可以完全禁用或者在每个字段的基础上自定义
_field_names字段
_field_names字段索引文档中所有包含非空值的字段名称。用于在存在查询和缺失查询中,查找指定字段拥有非空值的文档是否存在
_field_names字段的值可以用于查询、聚合以及脚本
PUT secisland/secislog/2 {"title":"this is a document"}
PUT secisland/secislog/2 {"title":"this is another document","body":"this document has a body"}
POST secisland/secislog/_search
{"query":{"terms":{"_field_names":["title"]}},"aggs":{"Field names":{"terms":{"field":"_field_names","size":10}}},"script_fields":{"Field names":{"script":"doc['_field_names']"}}}
_id字段
_id字段没有索引,其值可以从_uid字段自动生成
_id字段的值可以在查询以及脚本中访问,但在聚合或者排序时,要使用_uid字段而不能用_id字段
#在查询和脚本中使用_id字段
POST secisland/secislog/_search {"query":{"terms":{"_id":["1","2"]}},"script_fields":{"UID":{"script":"doc['_id']"}}}
_index字段
在多个索引中执行查询时,有里需要添加查询子句来关联特定的索引文档。_index字段可以匹配包含某个文档的索引
在term或terms查询、聚合、脚本以及排序时,可以访问_index字段的值
_index是一个虚拟字段,不作为真实字段添加到lucene中,这意味着可以在term terms或任何重写term的查询,如match、query_string、simple_query_string中使用,但是不支持prefix、wildcard、regexp、fuzzy查询
POST index_1,index_2/_search
{"query":{"terms":{"_index":["index_1","index_2"]}},"aggs":{"indices":{"terms":{"field":"_index","size":10}}},"sort":[{"_index":{"order":"asc"}}],"script_fields":{"index_name":{"script":"doc['_index']"}}}
_meta字段
每个映射类型都可以拥有自定义元数据,这些元数据对es来说毫无用处,但可以用来存储应用程序的特定元数据
PUT secisland {"mappings":{"user":{"_meta":{"class":"MyApp::User","version":{"min":"1.0","max":"1.3"}}}}}
_parent字段
在同一个索引中通过创建映射类型可以在文档间建立父子关系
PUT secisland {"mappings":{"my_parent":{},"my_child":{"_parent":{"type":"my_parent"}}}}
插入父文档:PUT secisland/my_parent/1 {"text":"this is a parent document"}
插入子文档并指定父文档:
PUT secisland/my_child/2?parent=1 {"text":"this is a child document"}
PUT secisland/my_child/3?parent=1 {"text":"this is another child document"}1、父子限制
父类型和子类型必须是不同的,父子关系不能建立在相同类型的文档之间
_parent的type设置只能指向一个当前不存在的类型,这意味着一个类型被创建后就无法成为父类型
父子文档必须索引在相同分片上,parent编号用于作为子文档的路由值,确保子文档被索引到父文档所在的分片中
获取、删除或者更新子文档时,需要提供相同的parent值2、整体序数
使用整体序数可以加快建立父子关系,分片发生任何改变后,整体序数都需要进行重建
整体序数默认为懒创建,可以通过参数将由查询触发改为刷新触发
PUT secisland {"mappings":{"my_parent":{},"my_child":{"_parent":{"type":"my_parent","fielddata":{"loading":"eager_global_ordinals"}}}}}
_routing字段
文档在索引中通过下面公式路由到特定分片:
shard_num = hash(_routing) % num_primary_shards
_routing字段默认值使用文档_id字段,若存在父文档,则使用文档的_parent编号
可以通过为每个文档指定自定义路由值来实现自定义路由
PUT secisland/secilog/1?routing=user1 {"title":"this is a document"}
使用user1作为路由,在获取、删除和更新文档时需要提供相同的路由值
_routing字段可以在查询、聚合、脚本以及排序时访问
POST secisland/_search {"query":{"terms":{"_routing":["user1"]}},"aggs":{"Routing values":{"terms":{"field":"_routing","size":10}}},"sort":[{"_routing":{"order":"desc"}}},"script_fields":{"Routing value":{"script":"doc['_routing']"}}}1、利用自定义路由进行搜索
自定义路由可以降低搜索压力,搜索请求可以仅仅发送到匹配指定路由值的分片而不是广播到所有分片
POST secisland/_search?routing=user1,user2 {"query":{"match":{"title":"document"}}}
搜索请求仅在关联路由值为user1和user2的分片上执行2、使路由值成为必选项
使用自定义路由索引、获取、删除或者更新文档时,提供路由值非常重要
忘记路由值会导致文档被一个以上分片索引,作为保障,_routing字段可以被设置,使自定义路由值成为所有CRUD操作的必选项
PUT secisland {"mappings":{"secilog":{"_routing":{"required":true}}}}3、自定义路由下的唯一编码
当索引指定自定义路由的文档时,不能保障所有分片_id的唯一性,只能依靠用户来确保编码的唯一性
_source字段
_source字段包含索引时原始的JSON文档内容,字段本身不建立索引,无法搜索,但会被存储,所以执行获取请求时,可以返回_source字段
_source字段会对索引产生存储开销,因此可以禁用_source字段
PUT secisland {"mappings":{"secilog":{"_source":{"enabled":false}}}}
可以通过提高压缩等级来实现节约存储空间,可以用包含/排除字段的特性在保存之前减少数据量
如果_source字段被禁用,会造成大量功能不可用:
#更新接口
#高亮显示功能
#重建索引功能,包含修改映射或者分析,升级索引到新的版本
#通过查看索引时的原始文档对查询或聚合进行调试的功能
#自动修复索引的功能
#从_source字段移除内容相当于精简版的禁用功能,尤其是无法重建文档索引
includes/excludes参数,可以使用通配符
PUT logs {"mappings":{"event":{"_source":{"includes":["*.count","meta.*"],"excludes":["meta.description","meta.other.*"]}}}}
移除的字段不会存储在_source中,但仍然可以搜索这些字段
_type字段
每个索引的文档都包含_type和_id字段,_type字段的目的是通过类型名加快搜索进度
_type字段的值可以在查询、聚合、脚本以及排序中访问
PUT secisland/type_1/1 {"text":"document with type 1"}
PUT secisland/type_2/2 {"text":"document with type 2"}
POST secisland/_search
{"query":{"terms":{"_type":["type_1","type_2"]}},"aggs":{"types":{"terms":{"field":"_type","size":10}}},"sort":[{"_type":{"order":"desc"}}],"script_fields":{"type":{"script":"doc['_type']"}}}
_uid字段
每个索引的文档都包含_type和_id字段,这两个值结合为{type}#{id}并且作为_uid字段被索引
_uid字段在查询、聚合、脚本以及排序时访问
PUT secisland/secilog/1 {"text":"document with id 1"}
PUT secisland/secilog/2 {"text":"document with id 2"}
POST secisland/_search {"query":{"terms":{"_uid":["secilog#1","secilog#2"]}},"aggs":{"UIDs":{"terms":{"field":"_uid","size":10}}},"sort":[{"_uid":{"order":"desc"}}],"script_fields":{"UID":{"script":"doc['_uid']"}}}
映射参数

映射参数对字段映射的特殊需求进行设置,包括字段分词、权重、是否被索引、日期格式等

analyzer参数
分词,分析器
分析的过程不仅发生在索引阶段,也发生在查询阶段:查询字符串需要通过相同、相似分析器进行分析。查询中的索引词和索引中的索引词具有相同格式
es查找分析器的顺序:
1、字段映射中定义的分析器
2、索引设置中名为default的分析器
3、标准分析器
4、在查询时,有更多的层次
5、在全文查询中定义的分析器
6、在字段映射中定义的搜索分析器
7、在字段映射中定义的分析器
8、在索引设置中名为default_search的分析器
9、在索引设置中名为default的分析器
10、标准分析器
为特定字段指定分词器最简单的方式是在字段映射中定义
PUT secisland {"mappings":{"secilog":{"properties":{"text":{"type":"string","fields":{"english":{"type":"string","analyzer":"english"}}}}}}}search_quote_analyzer参数可以对短语指定一个分析器,当处理禁用短语连接词的查询特别有用
为禁用短语连接词,字段需要利用三个分析器设置:
1、analyzer设置,用于索引包括连接词在内的所有索引词
2、search_analyzer设置,用于移除连接词的非短语查询
3、search_quote_analyzer设置,用于包括连接词在内的短语查询
PUT secisland
{"settings":{"analysis":{"analyzer":{"my_analyzer":{"type":"custom","tokenizer":"standard","filter":["lowercase"]},"my_stop_analyzer":{"type":"custom","tokenizer":"standard","filter":["lowercase","english_stop"]}},"filter":{"english_stop":{"type":"stop","stopwords":"_english_"}}}},"mappings":{"secilog":{"properties":{"title":{"type":"string","analyzer":"my_analyzer","search_analyzer":"my_stop_analyzer","search_quote_analyzer":"my_analyzer"}}}}}
插入数据:
PUT secisland/secilog/1 {"title":"The Quick Brown Fox"}
PUT secisland/secilog/2 {"title":"A Quick Brown Fox"}
进行短语查询:
POST secisland/secilog/_search {"query":{"query_string":{"query":"\"the quick brown fox\""}}}
当查询被包含在引号中时,表示为短语查询,search_quote_analyzer生效并确保查询中包含连接词
如果没有search_quote_analyzer,短语查询不能被精确匹配,两个文档都会被匹配
boost参数
在索引时,通过boost参数可以对一个字段进行加权,相关性得分更多
PUT secisland {"mappings":{"secilog":{"properties":{"title":{"type":"string","boost":2},"content":{"type":"string"}}}}}
此时title字段会有两倍加权,而content字段为默认值1
title字段通常比content字段短,默认的相关性计算需要考虑字段长度,因此短的字段会有一个更高的加权
索引时最好不要加权,因为除非重索引所有文档,索引加权值不会发生改变;每个查询都支持查询加权,会产生相同的效果,不同的地方在于不需要重索引就可以调整加权;
索引加权做为norm的一部分,只有一个字节,这降低了字段长度归一化因子的分辨率,会导致低质量的相关性计算
索引加权的唯一优势在于作用于_all字段,这意味着查询_all字段时,titlte字段的词会有更高的分数,但这是以计算成本为代价的,查询_all字段会变得更加缓慢
coerce参数
数据不都是干净的,强制尝试清理脏值来匹配字段的数据类型,如:
字符串会被强制转换为数字
浮点型数据会被截取为整形数据
经纬地理点数据会归一化到标准-180:180/-90:90坐标系统
PUT secisland {"mappings":{"secilog":{"properties":{"number_one":{"type":"integer"},"number_two":{"type":"integer","coerce":false}}}}}
插入数据:
PUT secisland/secilog/1 {"number_one":"10"}
PUT secisland/secilog/2 {"number_two":"10"}   #因为强制类型转换被禁用,文档2插入失败
同一索引中相同名称字段可以拥有不同的coerce设置,可以利用PUT映射接口来更新已存在字段的coerce值全局设置
index.mapping.coerce可以在索引级别对所有映射整体禁用强制类型转换
PUT secisland {"settings":{"index.mapping.coerce":false},"mappings":{"secilog":{"properties":{"number_one":{"type":"integer"},"number_two":{"type":"integer","coerce":true}}}}}
copy_to参数
利用copy_to可以创建自定义的_all字段。即多个字段的值可以被复制到一组字段,然后可以作为单个字段进行查询
PUT secisland
{"mappings":{"secilog":{"properties":{"first_name":{"type":"string","copy_to":"full_name"},"last_name":{"type":"string","copy_to":"full_name"},"full_name":{"type":"string"}}}}}
插入数据:
PUT secisland/secilog/1 {"first_name":"John","last_name":"Smith"}
查询:
POST secisland/secilog/_search {"query":{"match":{"full_name":{"query":"John Smith","operator":"and"}}}}
first_name和last_name字段的值会被复制到full_name字段中,first_name和last_name可以单独查询,full_name可以同时查询两个字段的内容
要点:
字段的值是复制过来的,而不是分析的结果
原始的_source字段不会展示复制的值
"copy_to":["field_1","field_2"]可以将相同值复制到多个字段
doc_values参数
大多数字段默认被索引,拿其可以被搜索到。文档值doc_values是磁盘上的数据结构,几乎支持所有字段类型,所有字段默认都包含在文档值中
如果确定某个字段不需要排序、聚合或脚本中访问,可以禁用文档值以节省存储空间。没有文档值的字段依然可查询
PUT secisland {"mappings":{"secilog":{"properties":{"status_code":{"type":"string","index":"not_analyzed"},"session_id":{"type":"string","index":"not_analyzed","doc_values":false}}}}}
同一个索引中,同名字段可以有不同的doc_values,可以通过PUT映射接口对其进行操作
dynamic参数
默认,字段可以被动态添加到一个文档中,或者添加到文档内部对象中,仅仅通过索引一个包含新字段的文档
dynamic控制新字段是否可以被动态添加,接受三种设置:
true,新检测到的字段会被添加到映射中(默认)
false,新检测到的字段会被忽略,新字段必须明确添加
strict,如果检测到新字段,抛出异常,丢弃文档
dynamic可以在映射类型级别以及每个内部对象被设置,内部对象从父对象或映射类型中继承设置值
PUT secisland {"mappings":{"secilog":{"dynamic":false,"properties":{"user":{"properties":{"name":{"type":"string"},"social_networks":{"dynamic":true,"properties":{}}}}}}}}
#动态映射在类型级别被禁用,所有顶级字段不会被自动添加,user.social_networds对象启用了动态映射,可以添加新的内部对象
enabled参数
仅存储字段而不进行索引,enabled可以被用于映射类型和对象字段,JSON仍然可以从_source字段取回,但不能搜索或以其他方式存储
PUT secisland {"mappings":{"session":{"properties":{"user_id":{"type":"string","index":"not_analyzed"},"last_updated":{"type":"date"},"session_data":{"enabled":false}}}}}
PUT secisland/session/session_1 {"user_id":"kimchy","session_data":{"arbitrary_object":{"some_arry":["foo","bar",{"baz":2}]}},"last_updated":"2018-04-12T18:20:22"}
PUT secisland/session/session_2 {"user_id":"jpountz","session_data":"none","last_updated":"2018-04-12T18:20:32"}
整个映射类型都可以被禁用,在这种情况下,文档被存储在_source字段,可以被取回,但没有任何内容以任何方式被索引
{"mappings":{"session":{"enabled":false}}}
fielddata参数
在排序、聚合或脚本中访问字段值可以通过doc_values实现访问,但是分析过的字符串字段不支持doc_values。
分词的字符串在查询时利用字段数据fielddata的数据结构,这个数据结构在字段被用于聚合、排序或脚访问的第一时间创建
字段数据有三个参数,format表示是否启用,loading用的时机和filter过滤加载的数据
加载字段数据是一个昂贵的过程,一但被加载,就会在分片的生命周期内驻留在内存中
字段数据会消耗大量堆内存空间,特别在加载高基数分词字符串字段,可以考虑字段是否不可分词(可以使用doc_values)以更好的适应场景
同一个索引中同名字段必须拥有相司的fielddata.*设置1、fielddata.format
对于分词字符串字段,format参数用来控制字段是否应该被启用,接受disabled和paged_bytes(启用,默认值)
禁用字段数据加载,可以使用下面的设置
PUT secisland {"mappings":{"secilog":{"properties":{"text":{"type":"string","fielddata":{"format":"disabled"}}}}}}
通过设置,test字段不能被用于排序、聚合或脚本2、fielddata.loading
针对每个字段的设置,控制字段数据加载到内存的时机,接受三个参数:
lazy 仅在需要时加载到内存中(默认)
eager 在新的搜索分片对搜索可见之前,就加载到内存中。对于大容量分片,提前加载,可以减少请求延迟
eager_global_ordinals 仅加载必须的部分到内存中。加载后,es创建整体序数数据结构来组成一个所有索引词的列表。默认请况下,整体序数是被动创建的,如果字段有非常高的基数,可以使用主动加载3、fielddata.filter
字段数据过滤可以用来减少加载到内存中的索引词数量,可以减少内存使用量。索引词可以通过频率或正则表达式以及两者的配合进行过滤
频率可以表示为确切的数字(数值大于1.0时)或百分比(数值小于等于1.0,1.0即为100%)
可以通过min_segment_size参数指定分片应该包含的最少文件量来完全排除小容量分片:
PUT secisland {"mappings":{"secilog":{"properties":{"tag":{"type":"string","fielddata":{"frequency":{"min":0.001,"max":0.1,"min_segment_size":500}}}}}}}
索引词也可以通过正则表达式进行过滤:只有匹配正则表达式的值会被加载,正则表达式应用于字段中的每个索引词,而不是整个字段值
PUT secisland {"mappings":{"secilog":{"properties":{"secilog":{"type":"string","analyzer":"whitespace","fielddata":{"filter":{"regex":{"pattern":"^#.*"}}}}}}}}
format参数
JSON文档中,日期用字符串表示,es利用预先定义的格式来识别和分析,并产生一个长整型数值,代表世界标准时间的毫秒数
除了内置格式,可以通俗的yyyy/MM/dd语法来指定自定义格式
PUT secisland {"mappings":{"secilog":{"properties":{"date":{"type":"date","format":"yyyy-MM-dd"}}}}}
支持日期值的接口也支持日期匹配表达式,如now-1m/d表示当前时间减去1个月,并四舍五入到最近的一天
同一个索引中同名字段必须有相同格式设置,已有字段可以通过PUT映射接口更新
支持的日期格式:
geohash参数
地理散列是把地球划分为网格的经纬度编码。地理散列越长,单元格越小,精确度超高,地理散列的长度通过geohash_precision控制
如果启用geohash_prefix,geohash选项会被自动启动
PUT secisland {"mappings":{"secilog":{"properties":{"location":{"type":"geo_point","geohash":true}}}}}
PUT secisland/secilog/1 {"location":{"lat":41.12,"lon":-71.34}}
每个地理点都会索引一个location.geohash字段,地理散列可以从doc_values中取回
geohash_precision参数
当启用地理散列是,地理精度设置可以控制地理散列的长度,当地理散列前缀启用时,地理精度设置可以控制散列的最大长度
接受参数:介于1到12(默认)之前的数字,代表地理散列长度;一段距离,如1km,最小的地理散列长度请求分辩率
PUT secisland {"mappings":{"secilog":{"properties":{"location":{"type":"geo_point","geohash_prefix":true,"geohash_precision":6}}}}}
PUT secisland/secilog/1 {"location":{"lat":41.12,"lon":-71.34}}
geohash_precision值为6时地理散列单元格面积近似为1.26km*0.6km
geohash_prefix参数
当启用地理散列选项,以一定精度将地理散列作为经纬度索引时,geohash_prefix选项也会索引到所有地理散列单元格中
如,一个drm3btev3e86地理散列会索引下列所有的索引词【d,dr,drm,drm3,drm3b...drm3btev3e86】,在geohash_cell查询中可以使用地理散列前缀查找特定的点,或者它的相邻点
PUT secisland {"mappings":{"secilog":{"properties":{"location":{"type":"geo_point","geohash_prefix":true,"geohash_precision":6}}}}}
PUT secisland/secilog/1 {"location":{"lat":41.12,"lon":-71.34}}
POST secisland/_search?fielddata_fields=location.geohash {"query":{"geohash_cell":{"location":{"lat":41.02,"lon":-71.48},"precision":4,"neighbors":true}}}
ignore_above参数
超过ignore_above参数设置长度的字符串不会被分词或者索引。主要用于不分词的字符串字段,这些字符串常用于过滤、聚合、排序
这些都是结构化的字段,让这些字段索引非常长的索引词通常是不明智的
PUT secisland {"mappings":{"secilog":{"properties":{"message":{"type":"string","index":"not_analyzed","ignore_above":20}}}}}
#message字段会忽略任何长度超过20个字符的字符串
#当message字段长度超过20个字符后,整个文档会被索引,但不会索引message字段的值
ignore_malformed参数
默认在试着索引错误的数据类型时会抛出异常并拒绝整个文档,如果ignore_malformed参数设为true,那么异常会被忽略,错误字段不会被索引(会存储值),但文档中的其他字段会正常处理
PUT secisland {"mappings":{"secilog":{"properties":{"number_one":{"type":"integer"},"number_two":{"type":"integer","ignore_malformed":true}}}}}
PUT secisland/secilog/1 {"text":"some text value","number_two":"foo"}
#不会抛出异常,number_two会存储foo
index.mapping.ignore_malformed设置可以用在索引级别上,在所有映射类型中忽略错误内容
PUT secisland {"settings":{"index.mapping.ignore_malformed":true},"mappings":{"secilog":{"properties":{"number_one":{"type":"byte"},"number_tow":{"type":"integer","ignore_malformed":false}}}}}
include_in_all参数
include_in_all参数对每个字段进行控制是否被包含在_all字段中。默认为true,除非索引被设为no
include_in_all还可以设置在类型级别以及对象或嵌入字段,子字段会继承该设置
PUT secisland {"mappings":{"secilog":{"include_in_all":false,"properties":{"title":{"type":"string"},"author":{"include_in_all":true,"properties":{"first_name":{"type":"string"},"last_name":{"type":"string"}}},"editor":{"properties":{"first_name":{"type":"string"},"last_name":{"type":"string","include_in_all":true}}}}}}}
index参数
控制字段值如何进行索引,以及如何搜索,接受三种值:
no,不要在索引中加入这个字段的值。字段不会被查询到
not_analyzed,字段值原封不动地添加到索引中,作为单一索引词。除了字符串字段之外的所有字段默认支持这个选项
analyzed,该选项仅用在字符串字段上,作为默认选项。字符串首先被分词为一组索引词,然后被索引。搜索时,查询字符串会通过相同分词器生成相同格式索引词,以实现全文搜索
PUT secisland {"mappings":{"secilog":{"properties":{"status_code":{"type":"string","index":"not_analyzed"}}}}}
index_options参数
index_options控制将什么信息添加到反向索引,用于搜索和强调的目的,接受参数如下:
docs,只有被索引的文档数量。可解决"字段是否包含这个索引词"的问题
freqs,被索引的文档数量和索引词频率。索引词频率使重复索引词得分高于单个索引词
positions,文档数量,索引词频率以及索引词位置。位置可以被用于邻近或者短语查询
offsets,文档数量,索引词频率、位置以及开始和结束字符偏移量(映射索引词到原始字符串)
分词字符串字段用position为默认值,其他字段用docs为默认值
PUT secisland {"mappings":{"secilog":{"properties":{"text":{"type":"string","index_options":"offsets"}}}}}
lat_lon参数
地理查询通过添加每个地理点字段的值到一个公式中,执行这个公式来决定地理点是否落入请求的区域中
设置lat_lon为true会使纬度和经度的值作为数字型字段(称.lat和.lon)被索引。这些字段可以用于地理范围查询和地理距离查询代替执行内存运算
PUT secisland {"mappings":{"secilog":{"properties":{"location":{"type":"geo_point","lat_lon":true}}}}}
#lat_lon为true,会在location.lat和location.lon字段索引地理点
PUT secisland/secilog/1 {"location":{"lat":41.12,"lon":-71.34}}
POST secisland/_search {"query":{"geo_distance":{"location":{"lat":41,"lon":-71},"distance":"50km","optimize_bbox":"indexed"}}}
#indexed参数会让地理距离查询利用反向索引值而不是内存运算
是执行内存还是索引操作更好,取决于数据集和执行的查询类型
lat_lon选项仅对单值地理点字段有意义,不会对地理点数组产生效果
fields参数
fields多字段,基于不同的目的用不同的方法索引相内的字段,如一个做为分词用于全文搜索,一个作为不分词用于排序和聚合
PUT secisland {"mappings":{"secilog":{"properties":{"city":{"type":"string","fields":{"raw":{"type":"string","index":"not_analyzed"}}}}}}}
#city字段是分词字段,可进行全文搜索;city.raw字段不分词,可用来排序或聚合使用多重分词器
多字段的另一种应用是对相同的字段进行不同方式的分词以达到更好的相关性。
如可以利用标准分词器将文本划分为单词,然后利用英文分词器把单词划分为词根的形式
PUT secisland {"mappings":{"secilog":{"properties":{"text":{"type":"string","fields":{"english":{"type":"string","analyzer":"english"}}}}}}}
#text字段使用标准分词器,text.english字段使用英文分词器
norms参数
norms存储各种标准化系数(一个数字),表示相关字段的长度和索引时相关性加权设置
用于在查询时计算文档对于查询条件的相关性得分,虽然对计算相关性得分非常有用,但norms也需要大量内存
如果不需要在一个特殊的字段上计算相关性得分,应该在字段上禁用norms,此时,字段仅用于过滤或聚合
norms可以通过PUT映射接口取消(不能被重新启用)
PUT secisland/_mapping/secilog {"properties":{"title":{"type":"string","norms":{"enabled":false}}}}
注:标准值不会立即移除,但索引新文件、旧分片融入新分片时,标准值会被移除,移除已有标准值字段计算出的得分可能会返回不同的结果
标准值延迟加载
当新分片上线,标准值可以被优先eager加载到内存,或当字段被查询时,标准值被延迟加载lazy默认
PUT secisland/_mapping/secilog {"properties":{"title":{"type":"string","norms":{"loading":"eager"}}}}
null_value参数
空值是不能被索引或搜索的。当一个字段设置为null或者是一个空数组或者null值的数组,这个字段会当作没有值的字段
null_value可以用指定的值替换掉确切的空值,以便可以被索引和搜索
PUT secisland {"mappings":{"secilog":{"properties":{"status_code":{"type":"string","index":"not_analyzed","null_value":"NULL"}}}}}
PUT secisland/secilog/1 {"status_code":null}
PUT secisland/secilog/2 {"status_code":[]}
注:null_value需要设置和字段相同的数据类型
position_increment_gap参数
为支持短语查询,需要保存可分词字符串字段中分词的位置。当字符串字段索引多个值,一个“虚拟”缺口被添加到各个值之间防止短语查询跨值匹配,缺口大小通过position_increment_gap配置,默认值100
PUT secisland {"mappings":{"secilog":{"properties":{"names":{"type":"string","position_increment_gap":0}}}}}
#下一个元素数组的第一个索引词与上一个元素数组的最后一个索引词之间0个索引词间隔,短语查询匹配将表现为怪异,非预期
precision_stip参数
数字型数据类型索引额外的索引词表示每个数字的范围,使范围查询更加便捷
"range":{"number":{"gte":0,"lte":321}}
这从本质上作为索引词查询,结构为:
"terms":{"number":["0-255","256-319","320","321"]}
precision_step默认值取决于数字型字段的类型
properties参数
类型映射,对象字段和嵌套类型字段包含子字段,称为属性。这些属性可以是任何数据类型,包含对象和嵌套类型,属性在以下情况添加:
创建索引时明确定义
利用映射接口添加或修改映射类型时明确定义
索引包含新字段的文档可以动态添加
PUT secisland {"mappings":{"secilog":{"properties":{"manager":{"properties":{"age":{"type":"integer"},"name":{"type":"string"}}},"employees":{"type":"nested","properties":{"age":{"type":"integer"},"name":{"type":"string"}}}}}}}点符号
查询、聚合等方法可以使用点符号获取内部字段
POST secisland/_search {"query":{"match":{"manager.name":"Alice White"}},"aggs":{"Employees":{"nested":{"path":"employees"},"aggs":{"Emplyee Ages":{"histogram":{"field":"employees.age","interval":5}}}}}}
#必须指定内部字段的完整路径
search_analyzer参数
通常,索引时和搜索时使用的分词器是相同的,但可以通过search_analyzer为搜索时指定不同的分词器
PUT secisland {"settings":{"analysis":{"filter":{"autocomplete_filter":{"type":"edge_ngram","min_gram":1,"max_gram":20}},"analyzer":{"autocomplete":{"type":"custom","tokenizer":"standard","filter":["lowercase","autocomplete_filter"]}}}},"mappings":{"secilog":{"properties":{"text":{"type":"string","analyzer":"autocomplete","search_analyzer":"standard"}}}}}
similarity参数
es允许对每个字段配置得分算法或相似算法。similarity参数提供一个简单的方式来选择不同于默认的TF/IDF算法,例如BM25
相似算法多用于字符串字段,特别是可分词的字符串字段,但也可以应用于其他字段类型
自定义相似算法可以通过调整内置相似算法的参数进行配置
不用更多配置就可直接使用的相似算法有:
default,es和lucene默认的TF/IDF算法
BM25,Okapi BM25算法
相似算法可以在字段第一次创建时在字段级别上进行设置
PUT secisland {"mappings":{"secilog":{"properties":{"default_field":{"type":"string"},"bm25_field":{"type":"string","similarity":"BM25"}}}}}
store参数
默认,字段值被索引来确保可以被搜索,但不会被存储。这意味着可以查询字段,但无法取回原始字段值
通常这没有什么问题,因为字段值是默认_source字段的一部分。如果想取回单个字段或一些字段的值,而不是整个_source字段,可以通过数据源过滤实现
PUT secisland {"mappings":{"secilog":{"properties":{"title":{"type":"string","store":true},"date":{"type":"date","store":true},"content":{"type":"string"}}}}}
#title和date字段会被存储
PUT secisland/secilog/1 {"title":"this title","date":"2018-08-11","content":"this is content"}
POST secisland/_search {"fields":["title","date"]}  #取回title和date的值
term_vector参数
索引词向量包含分析过程产生的索引词信息,包括:
索引词列表
每个索引词的位置
映射索引词到原始字符串中原始位置中开始和结束字符的偏移量
这些索引词向量会被存储,所以可以作为一个特殊文档取回
term_vector设置接受参数:
no,不存储索引词向量(默认)
yes,只存储字段的索引词
with_positions,索引词和位置将会被存储
with_offsets,索引词和字符偏移量会被存储
with_positions_offsets,索引词,位置以及偏移量都会被存储
PUT secisland {"mappings":{"secilog":{"properties":{"text":{"type":"string","term_vector":"with_positions_offsets"}}}}}
动态映射
概念
PUT data/counters/1 {"count":5}
自动创建索引为data,映射类型为counters,字段名为count,类型为long
_default_映射,用于创建映射类型的基础映射
动态字段映射,控制动态字段检测规则
动态模板,自定义规则来配置动态添加字段的映射
禁用动态类型创建,通过设置index.mapper.dynamic为false来禁用,可以在配置文件或在每个索引中进行设置
PUT _settings {"index.mapper.dynamic":false}   #对所有索引禁用动态类型创建
_default_映射
默认映射,用作每个新映射类型的基础映射,可以通过在索引中增加名为_default_的映射类型来自定义
PUT secisland {"mappings":{"_default_":{"_all":{"enabled":false}},"user":{},"blogpost":{"_all":{"enabled":true}}}}
#_default_禁用_all,user继承_default_,blogpost重写默认设置,启用_all
_default_映射可以在索引创建后进行修改,新的默认映射只会影响之后创建的映射类型
动态字段映射

 

默认的,在文档中发现新字段时,会自动添加新字段到类型映射中,这种默认行为可以被禁用,通过设置动态参数为false或strict
若启用动态字段映射,数据类型规则如下表:

可以通过动态模板自定义更多的动态字段映射规则

1、日期检查
默认启用日期检查,如果匹配任何dynamic_date_formats中指定的日期格式,新的日期字段会以相同的格式添加
dynamic_date_formats默认值为["strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]

2、禁用日期检查
设置date_detection为false
PUT secisland {"mappings":{"secilog":{"date_detection":false}}}

3、自定义日期检查格式
PUT secisland {"mappings":{"secilog":{"dynamic_date_formats":["MM/dd/yyyy"]}}}

4、数字检查
JSON支持浮点型和整型数据类型,一些应用或语言会以字符串传递数字,通常明确定义这些字段映射,但也可以启用数字检查(默认禁用)来自动做类型转换
PUT secisland {"mappings":{"secilog":{"numeric_detection":true}}}

动态模板
动态模板可以定义自定义映射用来动态添加字段,基于以下参数:
通过es进行数据类型检查,利用match_mapping_type参数
字段名,利用match和unmatch或match_pattern参数
字段全路径,利用path_match和path_unmatch参数
原始字段名{name}和数据类型检查{dynamic_type}模板变量可以作为点位符用在映射标准中
动态字段映射仅在字段包含具体值(不为null或空数组)时添加,这意味着如果在dynamic_template中有null_value选项,需要第一个文档中被索引的字段有具体的值后,null_value才会起作用动态模板被指定为命名的对象数组

模板名可以是任何字符串值
匹配条件可以包含所有的:match_mapping_type、match、match_pattern、unmatch、path_match、path_unmatch
mapping包含匹配到的字段需要使用的映射值
模板顺序执行,第一个匹配到的模板起作用,新的模板可以用增加映射接口添加到表的末尾,如果新模板与旧模板名字相同,旧版本会被替换掉

1、match_mapping_type
match_mapping_type根据字段的数据类型进行自定义映射。只有boolean、date、double、long、object、string,也可接受*来匹配所有的数据类型
#映射所有整数型字段为integer而不是long,以及所有可分词和不可分词的字符串字段
PUT secisland {"mappings":{"secilog":{"dynamic_templates":[{"integers":{"match_mapping_type":"long","mapping":{"type":"integer"}}},{"strings":{"match_mapping_type":"string","mapping":{"type":"string","fields":{"raw":{"type":"string","index":"not_analyzed","ignore_above":256}}}}}]}}}

2、match和unmatch
match使用匹配字符名称的方式;unmatch使用排除match匹配字段的方式
#匹配所有字符串型字段名以long_开头并排除以_text结尾的字段,索引这些字段为长整型字段
PUT secisland {"mappings":{"secilog":{"dynamic_templates":[{"longs_as_strings":{"match_mapping_type":"string","match":"long_*","unmatch":"*_text","mapping":{"type":"long"}}}]}}}

3、match_pattern
match_pattern支持完整的Java正则表达式匹配字段名而不是简单的通配符
"match_pattern":"regex"

4、path_match和path_unmatch
工作方式与match和unmatch相同,但在字段全路径上进行操作,不仅仅是在最终的名字上
PUT secisland {"mappings":{"secilog":{"dynamic_templates":[{"full_name":{"path_match":"name.*","path_unmatch":"*.middle","mapping":{"type":"string","copy_to":"full_name"}}}]}}}

5、{name}和{dynamic_type}
点位符会被映射中的字段名和字段类型替换
#设置所有字符型字段使用与字段同名的分析器,禁用所有非字符型字段的doc_values参数
PUT secisland {"mappings":{"secilog":{"dynamic_templates":[{"named_analyzers":{"match_mapping_type":"string","match":"*","mapping":{"type":"string","analyzer":"{name}"}}},{"no_doc_values":{"match_mapping_type":"*","mapping":{"type":"dynamic_type","doc_values":false}}}]}}}

重写默认模板
可以重写所有索引的默认映射,也可以通过在索引模板中指定_default_类型映射重写映射类型
#对所有新索引中的类型禁用_all字段
PUT _template/disable_all_field {"disable_all_field":{"order":0,"template":"*","mappings":{"_default_":{"_all":{"enabled":false}}}}}

转载请注明:轻风博客 » elasticsearch技术解析与实战(二) 映射

喜欢 (0)or分享 (0)