赞
踩
范围类型,范围字段类型表示上限和下限之间的连续值范围。例如,一个范围可以表示十月的任何日期或从 0 到 9 的任何整数。它们是使用运算符 gt或gte用于下限和lt或lte用于上限定义的。它们可用于查询,但对聚合的支持有限。
ip 字段类型(ip)存储IPv4或IPv6
version 版本字段类型
在 Elasticsearch 中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值必须属于相同的字段类型
映射是定义文档及其包含的字段如何存储和索引的过程
默认情况下,当 Elasticsearch 检测到文档中的新字段时,它会默认将该字段动态添加到类型映射中。此功能由映射的参数 dynamic 来决定,这个我们后续来详细说明。
动态字段映射类型对应表
JSON 字段类型 | “dynamic”:“true” | “dynamic”:“runtime” |
---|---|---|
null | 无对应字段 | 无对应字段 |
true/false | boolean | boolean |
double | float | double |
long | long | long |
object | object | 无对应字段 |
array | 取决于数组中第一个非null值 | 取决于数组中第一个非null值 |
string通过日期检测 | date | date |
string通过数值检测 | float或者long | float或者long |
string没有通过date检测或numeric检测 | text有一个.keyword子字段 | keyword |
date_detection 禁用日期检测
{ "mappings": { "date_detection": false } }
- 1
- 2
- 3
- 4
- 5
dynamic_date_formats 自定义动态映射的日期格式
{ "mappings": { "dynamic_date_formats": ["MM/dd/yyyy"] // 可配置多个格式 } }
- 1
- 2
- 3
- 4
- 5
numeric_detection false禁用或true启用数字检测(默认为禁用的,在某些应用中,数字会被映射成text)
{ "mappings": { "numeric_detection": true } }
- 1
- 2
- 3
- 4
- 5
动态模板映射,是为了控制在默认动态字段映射规则之外映射数据。在进行索引映射的时候,通过各种条件去对应适配动态模板,但此方式也不能解决更精确的字段映射,所以此处我们就不展开说了。
我们在日常开发使用中,我建议大家使用显式映射,以更精确的映射字段类型。更便于 elasticsearch 针对对应字段做更精确的索引分析等。
使用创建索引的API直接映射字段(关于创建索引API的说明,请查看 Elasticsearch REST API 索引管理 )
PUT /person
{
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"birthday": {
"type": "date",
"format":"yyyy-MM-dd HH:mm:ss"
},
"name": {
"type": "keyword"
},
"height": {
"type": "float"
},
"id": {
"type": "long"
},
"sex":{
"type": "byte"
}
}
}
}
如果咱们不显式定义映射,那么 birthday 和 name 都会被映射为 text 类型。
PUT /<target>/_mapping
allow_no_indices
(可选,布尔值)如果 为false,任何通配符表达式、索引别名或值目标仅丢失或关闭索引,请求将返回错误 。例如,如果请求索引以 foo*,bar* 开头,如果有索引,以foo开头但没有索引以bar开头,则请求定位会返回错误。 默认为true.
expand_wildcards
(可选,字符串)通配符模式可以匹配的索引类型。支持逗号分隔值,例如open,hidden。默认为open.可选值为:
all
匹配任何数据流或索引,包括隐藏的。
open
匹配开放的、非隐藏的索引。也匹配任何非隐藏数据流。
closed
匹配封闭的、非隐藏的索引。也匹配任何非隐藏数据流。数据流无法关闭。
hidden
匹配隐藏的数据流和隐藏的索引。open必须与、 closed或两者 结合使用。
none
不接受通配符模式。
ignore_unavailable
(可选,布尔值)false,如果请求针对丢失或关闭的索引,则请求返回错误。默认为false.
local
(可选,布尔值)true,则请求仅从本地节点检索信息。默认为false,这意味着信息是从主节点检索的。
master_timeout
(可选,时间单位)等待连接到主节点的时间。如果在超时到期之前未收到响应,则请求失败并返回错误。默认为 30s.
properties
(必填,映射对象)字段的映射。对于新字段,此映射可以包括:
PUT /person/_mapping
{
"properties":{
"weight": {
"type": "float"
}
}
}
PUT /person/_mapping
{
"properties":{
"child": {
"properties": {
"name": {
"type": "keyword"
}
}
}
}
}
注:此操作要谨慎操作,更改现有字段可能会使已编制索引的数据无效。必须要修改,修改之后需要重新索引。
如:把我们刚刚添加的新字段映射类型修改为 keyword
PUT /person/_mapping
{
"properties":{
"weight": {
"type": "keyword"
}
}
}
修改之后,我们需要重新索引(请查看上一篇文章 Elasticsearch REST API 文档管理)
GET /_mapping
GET /<target>/_mapping
allow_no_indices
(可选,布尔值)如果 为false,任何通配符表达式、索引别名或值目标仅丢失或关闭索引,请求将返回错误 。例如,如果请求索引以 foo*,bar* 开头,如果有索引,以foo开头但没有索引以bar开头,则请求定位会返回错误。 默认为true.
expand_wildcards
(可选,字符串)通配符模式可以匹配的索引类型。支持逗号分隔值,例如open,hidden。默认为open.可选值为:
all
匹配任何数据流或索引,包括隐藏的。
open
匹配开放的、非隐藏的索引。也匹配任何非隐藏数据流。
closed
匹配封闭的、非隐藏的索引。也匹配任何非隐藏数据流。数据流无法关闭。
hidden
匹配隐藏的数据流和隐藏的索引。open必须与、 closed或两者 结合使用。
none
不接受通配符模式。
ignore_unavailable
(可选,布尔值)false,如果请求针对丢失或关闭的索引,则请求返回错误。默认为false.
local
(可选,布尔值)true,则请求仅从本地节点检索信息。默认为false,这意味着信息是从主节点检索的。
master_timeout
(可选,时间单位)等待连接到主节点的时间。如果在超时到期之前未收到响应,则请求失败并返回错误。默认为 30s.
示例:查询映射
GET /person/_mapping
示例:查询所有映射
GET /*/_mapping
GET /_all/_mapping
GET /_mapping
作用于文档或文档的内部对象
PUT /person
{
"mappings": {
"dynamic": false,
"properties": {
"user": {
"properties": {
"name": {
"type": "text"
},
"car": {
"dynamic": true,
"properties": {}
}
}
}
}
}
}
该映射表示,我们的文档第一层的字段,只有user,新增的字段将不不会被索引或搜索,而user字段对象,car对象的字段可以动态新增并添加到映射。
如果设置为true(默认为true)elasticsearch 将会自动转换我们在创建文档时传入的值:
PUT my-index-000001
{
"mappings": {
"properties": {
"number_one": {
"type": "integer"
},
"number_two": {
"type": "integer",
"coerce": false
}
}
}
}
PUT my-index-000001/_doc/1
{
"number_one": "10"
}
PUT my-index-000001/_doc/2
{
"number_two": "10"
}
number_one 的 10 会被转换为整型,但 number_two 文档会报错无法新增。
PUT my-index-000001
{
"settings": {
"index.mapping.coerce": false
},
"mappings": {
"properties": {
"number_one": {
"type": "integer",
"coerce": true
},
"number_two": {
"type": "integer"
}
}
}
}
使用索引的settings来设置index.mapping.coerce,禁用自动强制类型转换。
指定的分析器用于索引和搜索分析
关于分析器的具体功能,我们将在后续文章中单独讲解。
同 analyzer 只不过是其只指定 用于搜索的分析器。
注:一般情况下用于索引和搜索的分析器应该为同一个,所以只指定analyzer 即可。
copy_to 可以将多个字段的值复制到一个组字段中,然后可以将其作为单个字段进行查询。
PUT my-index-000001
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
PUT my-index-000001/_doc/1
{
"first_name": "John",
"last_name": "Smith"
}
GET my-index-000001/_search
{
"query": {
"match": {
"full_name": {
"query": "John Smith",
"operator": "and"
}
}
}
}
elasticsearch 默认情况下,会为我们添加的字段添加索引,如果我们只想存储字段而不对其建立索引。可以使用 enabled 参数
注:enabled 只能作用于 索引级别或文档中的object字段
PUT /index
{
"mappings": {
"enabled": true,
"properties": {
"name": {
"type":"keyword"
},
"car":{
"type": "object",
"enabled":false
}
}
}
}
日期格式化的格式遵循Java的日期格式化格式,如:yyyy-MM-dd HH:mm:ss.SSS。我们在文档管理的示例中已经添加过了。
ignore_above 数字类型,比如:20.表示字符串超过相应长度,将不被索引。
ignore_malformed 正常情况下,日期类型不正确或数字类型不正确,将忽略此字段,而且文档的其他字段会正常存储。如果设置为false,则如果出现日期类型不正确将会导致整个文档添加失败。
为不同的目的以不同的方式索引同一个字段, string 字段可以映射为 text 用于全文搜索,也可以映射为 keyword 用于排序或聚合
PUT my-index-000001
{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
PUT my-index-000001/_doc/1
{
"city": "New York"
}
PUT my-index-000001/_doc/2
{
"city": "York"
}
GET my-index-000001/_search
{
"query": {
"match": {
"city": "york"
}
},
"sort": {
"city.raw": "asc"
},
"aggs": {
"Cities": {
"terms": {
"field": "city.raw"
}
}
}
}
null_value 将显式值替换null为指定值,以便对其进行索引和搜索。
PUT my-index-000001
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
此示例我们将null值映射为 “NULL” 字符串
是否将数据进行独立存储,默认为 false
原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。