1. 前言
Mapping(映射)用来定义文档包含的字段名、字段数据类型以及文档如何存储和索引这些字段的规则,例如,使用映射来定义:
- 哪些字符串字段应该作为全文字段(text)处理。
- 哪些字段包含数字、日期或地理位置。
- 日期值的格式。
- 控制动态添加字段的映射的自定义规则。
例如,文章的索引Mapping定义如下:
Mapping既可以是创建索引时使用,也可以预先显式定义。
映射字段种类包括有:
- 元数据字段(Metadata fields)
元数据字段用于定制如何处理与文档相关的元数据。例如,元数据字段包括文档的_index、_id和_source字段。 - 定义的字段或属性(Fields or properties)
定义文档中包括哪些字段或属性列表。
2. 字段数据类型
索引文档中的每个字段都有一个数据类型。既可以是一种简单的类型(比如text、keyword、date、long等),也可以是JSON分层特性的类型或者特殊类型(比如object、nested、geo_point等)。
同一个字段如果使用不同的数据类型,那么它的意义也是不同的,例如,字符串既可以定义为text字段类型进行分析索引,以便进行全文搜索,也可以定义为keyword字段类型保持原样进行索引,以便进行排序或聚合。
字段类型按照家族系列分组,同一系列的类型支持相同的搜索功能,只是可能在性能特性或存储空间上有所不同。下面介绍几种字段类型。
2.1 普通类型
Binary
- 描述:二进制类型,类型值binary。接收一个Base64编码的二进制值。该类型定义的字段不可搜索,且默认不存储。
- 操作示例如下:
PUT my-index-000001
{
"mappings": {
"properties": {
"name": {
"type": "text",
"store": false
},
"blob": {
"type": "binary"
}
}
}
}
PUT my-index-000001/_doc/1
{
"name": "Some binary blob",
"blob": "U29tZSBiaW5hcnkgYmxvYg=="
}
GET my-index-000001/_doc/1
{
}
- 支持的类型参数:doc_values(默认false)、store(默认false)。
Boolean
- 描述:布尔类型,类型值boolean。接受true、false值,也支持字符串"true"、"false" 或空字符串"",空字符串表示false。在聚合操作时,返回boolean类型使用1和0作为key,使用字符串“true”和“false”作为key_as_string。
- 操作示例如下:
(1)创建索引及索引数据
PUT my-index-000002
{"mappings":{"properties":{"is_published":{"type":"boolean"}}}}
POST my-index-000002/_doc/1
{"is_published":true}
POST my-index-000002/_doc/2
{"is_published":"false"}
(2)按照字段is_published聚合:
GET my-index-000002/_search
{"aggs":{"publish_state":{"terms":{"field":"is_published"}}}}
聚合结果片段如下:
"aggregations" : {
"publish_state" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 0,
"key_as_string" : "false",
"doc_count" : 1
},
{
"key" : 1,
"key_as_string" : "true",
"doc_count" : 1
}
]
}
}
- 支持的类型参数:boost(默认1.0)、doc_values(默认true)、index(默认true)、null_value(默认null)、store(默认false)、meta,所以在默认情况下,该类型字段支持可搜索,不可存储。
Keyword
- 描述:关键字类型家族,类型值包括keyword、 constant_keyword以及 wildcard。用于索引结构化的内容,比如主机名、状态代码、邮政编码,通常作用于过滤查找、排序和聚合操作,但是只能通过确切的值进行搜索,返回字段值完全匹配的文档数据。
- 操作示例如下:
PUT my-index-000003
{"mappings":{"properties":{"tags":{"type":"keyword"}}}}
POST my-index-000003/_doc/1
{"tags":"big ball"}
POST my-index-000003/_doc/2
{"tags":"small ball"}
## 通过确切的值搜索
GET my-index-000003/_search
{"query":{"match":{"tags":"small ball"}}}
- 支持的类型参数:boost(默认1.0)、doc_values(默认true)、eager_global_ordinals(默认false)、fields、ignore_above、 index(默认true)、index_options、norms(默认false)、null_value(默认null)、similarity(默认BM25)、normalizer(默认null)、store(默认false)、meta,所以在默认情况下,该类型字段支持可搜索,不可存储。
Numbers
- 描述:数字类型家族,类型值包括long、 integer、short、byte、double、float、half_float、scale_float。对于数字类型的选择时,根据满足实际情况选择最小的类型,这样对于索引和搜索更有效,但是es存储是基于存储的实际值进行优化的,因此选择一种类型不影响存储要求。
- 操作示例如下:
PUT my-index-000004
{"mappings":{"properties":{"number_of_bytes":{"type":"integer"},"time_in_seconds":{"type":"float"},"price":{"type":"scaled_float","scaling_factor":100}}}}
POST my-index-000004/_doc/1
{"number_of_bytes":100,"time_in_seconds":1,"scaling_factor":100}
GET my-index-000004/_search
{}
- 支持的类型参数:coerce(默认true)、boost(默认1.0)、doc_values(默认true)、ignore_malformed(默认false)、
index(默认true)、null_value(默认null)、store(默认false)、meta,所以在默认情况下,该类型字段支持可搜索,不可存储。
Dates
- 描述:日期类型家族,类型值包括date、date_nanos。JSON没有日期数据类型,所以在Elasticsearch的日期可以是:
(1)包含格式化日期的字符串,例如,“2015-01-01”或“2015/01/01 12:10:30”。
(2)long数字值milliseconds-since-the-epoch。
(3)integer数字值seconds-since-the-epoch。
注:milliseconds-since-the-epoch 和 seconds-since-the-epoch 必须是非负数。格式化日期表示从1970以后的日期。 - 操作示例如下:
PUT my-index-000005
{"mappings":{"properties":{"date":{"type":"date","store":true}}}}
PUT my-index-000005/_doc/1
{"date":"2015-01-01"}
PUT my-index-000005/_doc/2
{ "date": "2015-01-01T12:10:30Z" }
PUT my-index-000005/_doc/3
{"date":1420070400001}
GET my-index-000005/_search
{"sort":{"date":"asc"}}
- 在es内部,如果指定了时区,字符串形式日期被转换为UTC,进一步转换为milliseconds-since-the-epoch进行存储;对于字符串形式日期的查询,在内部也是先转换为long数字值进行范围查询,对于查询结果和聚合的响应,则将long数字转换回原来字符串形式返回。
- 日期格式可以自定义,如果没有指定格式,使用默认格式:
// 必须日期+可选时间 或者 时间毫秒数
"strict_date_optional_time||epoch_millis"
- 多个日期格式支持。通过使用||作为分隔符来分隔多个格式。索引时将依次尝试每种格式,直到找到匹配的格式,操作示例如下:
PUT my-index-000005_01
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
- 支持的类型参数:boost(默认1.0)、doc_values(默认true)、format(默认strict_date_optional_time||epoch_millis)、locale、ignore_malformed(默认false)、index(默认true)、null_value(默认null)、store(默认false)、meta,所以在默认情况下,该类型字段支持可搜索,不可存储。
- date_nanos 类型和 date 类型之间有一个重要区别,date数据类型以毫秒的分辨率存储日期。date_nanos数据类型以纳秒分辨率存储日期,这限制了date_nanos的日期范围大约从1970年到2262。
Alias
- 描述:字段别名类型,类型值alias。别名映射为索引中的字段定义了一个替代名称。在搜索请求中别名可以代替目标字段。
- 操作示例如下:
PUT my-index-000006
{
"mappings": {
"properties": {
"distance": {
"type": "long"
},
"route_length_miles": {
"type": "alias",
"path": "distance"
}
}
}
}
PUT my-index-000006/_doc/1
{"distance":50}
PUT my-index-000006/_doc/2
{"distance":10}
GET my-index-000006/_search
{"query":{"range":{"route_length_miles":{"gte":39}}}}
注:path参数值必须对应目标字段的全路径,包括目录字段的父级字段,如object1.object2.field。
- 字段别名的目标字段有一些限制:
(1)目标必须是一个具体字段,不能是一个对象或字段别名。
(2)创建字段别名时,目标字段必须存在。
(3)如果定义了嵌套对象,则字段别名必须具有与其目标相同的嵌套范围。
(4)字段别名只能有一个目标。
2.2 对象和关系型类型
Object
- 描述:JSON对象类型,可以嵌套JSON对象。不需要显式设置类型值为object,因为这是系统默认值。
- 操作示例如下:
PUT my-index-000007
{
"mappings": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"properties": {
"age": {
"type": "integer"
},
"name": {
"properties": {
"first": {
"type": "text"
},
"last": {
"type": "text"
}
}
}
}
}
}
}
}
数据索引时,支持key-value键值对格式的数据。
PUT my-index-000007/_doc/1
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
PUT my-index-000007/_doc/2
{
"region": "China",
"manager.age": 100,
"manager.name.first": "SanFeng",
"manager.name.last": "Zhang"
}
- 支持的类型参数:
(1)dynamic:是否应该向现有对象动态添加新属性。接受true(默认值)、false和strict。
(2)enabled:对象字段的JSON值应该被解析和索引(true,默认)还是完全忽略(false)。
(3)properties:对象中的字段,可以是任何数据类型,包括object。可以向现有对象添加新属性。
Flattened
- 描述:扁平JSON对象类型,类型值flattened,将整个JSON对象映射为单个字段值。给定一个对象,flattened类型映射将解析出它的叶子值,并将它们作为关键字索引到一个字段中。扁平的对象字段目前无法存储,不能在映射中指定存储参数。
- 操作示例如下:
PUT my-index-000008
{"mappings":{"properties":{"title":{"type":"text"},"labels":{"type":"flattened"}}}}
POST my-index-000008/_doc/1
{"title":"Results are not sorted correctly.","labels":{"priority":"urgent","release":["v1.2.5","v1.3.0"],"timestamp":{"created":1541458026,"closed":1541457010}}}
搜索数据时,支持基本的查询
GET my-index-000008/_search
{"query":{"match":{"labels.release":"v1.2.5"}}}
- 如果对象具有大量或未知数量的唯一键,那么使用该数据类型将整个JSON对象创建一个字段映射,有助于防止映射爆发。
- 该字段类型的对象具有一些限制,其中包括只允许基本的查询,不支持数值范围查询或高亮显示,不支持通配符引用字段key查询。
- 支持的类型参数:boost(默认1.0)、doc_values(默认true)、eager_global_ordinals(默认false)、ignore_above、 index(默认true)、index_options、null_value(默认null)、similarity(默认BM25)、split_queries_on_whitespace(默认false),所以在默认情况下,该类型字段支持可搜索,不可存储。
Nested
- 描述:嵌套对象类型,类型值nested,是对象数据类型的特殊版本,它允许以一种可以互相独立查询的方式对对象数组进行索引。
使用嵌套对象类型对文档的查询开销很大,如果需要为对象数组建立索引并维护数组中每个对象的独立性(可搜索等),那么可以使用嵌套对象类型。 - 在内部,嵌套对象索引数组中的每个对象作为一个单独的隐藏文档,这意味着每个嵌套对象可以通过嵌套查询独立于其他对象进行查询。
- 操作示例如下:
PUT my-index-000009
{"mappings":{"properties":{"user":{"type":"nested"}}}}
PUT my-index-000009/_doc/1
{"group":"fans","user":[{"first":"John","last":"Smith"},{"first":"Alice","last":"White"}]}
# 返回匹配的数据,如果是普通Object类型,查不到数据
GET my-index-000009/_search
{"query":{"nested":{"path":"user","query":{"bool":{"must":[{"match":{"user.first":"Alice"}},{"match":{"user.last":"White"}}]}}}}}
# 返回匹配的数据,并且高亮显示每个对象中first字段
GET my-index-000009/_search
{"query":{"nested":{"path":"user","query":{"bool":{"must":[{"match":{"user.first":"Alice"}},{"match":{"user.last":"White"}}]}},"inner_hits":{"highlight":{"fields":{"user.first":{}}}}}}}
Join
- 描述:连接对象类型,类型值join,它在具有相同索引的文档中创建父/子关系。关系部分定义了文档中的一组可能的关系,每个关系分别是父名称和子名称。
- 操作示例如下:
(1)定义父/子关系如下:
# my_join_field字段,定义了简单的关系,question是answer的父类。
PUT my-index-000010
{
"mappings": {
"properties": {
"my_id": {
"type": "keyword"
},
"my_join_field": {
"type": "join",
"relations": {
"question": "answer"
}
}
}
}
}
其中,名称为my_join_field字段为join字段类型,定义了简单的关系,question是answer的父类。
(2)索引name="question"的数据:
# 索引数据
PUT my-index-000010/_doc/1?refresh
{
"my_id": "1",
"text": "This is a question",
"my_join_field": {
"name": "question"
}
}
PUT my-index-000010/_doc/2?refresh
{
"my_id": "2",
"text": "This is another question",
"my_join_field": {
"name": "question"
}
}
(3)接下来索引name="answer"(指定parent=1,即与文档1建立父类关系)的数据:
PUT my-index-000010/_doc/3?routing=1&refresh
{
"my_id": "3",
"text": "This is an answer",
"my_join_field": {
"name": "answer",
"parent": "1"
}
}
PUT my-index-000010/_doc/4?routing=1&refresh
{
"my_id": "4",
"text": "This is another answer",
"my_join_field": {
"name": "answer",
"parent": "1"
}
}
(4)查询聚合数据,条件是name="answer" 并且 parent_id=1。
GET my-index-000010/_search
{
"query": {
"parent_id": {
"type": "answer",
"id": "1"
}
},
"aggs": {
"parents": {
"terms": {
"field": "my_join_field#question",
"size": 10
}
}
}
}
(5)返回结果片段如下
"aggregations" : {
"parents" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "1",
"doc_count" : 2
}
]
}
}
2.3 结构体类型
Range
- 描述:范围类型家族,类型值包括integer_range、float_range、long_range、double_range、date_range、ip_range。
- 操作示例如下:
PUT my-index-000011
{
"mappings": {
"properties": {
"expected_attendees": {
"type": "integer_range"
},
"time_frame": {
"type": "date_range",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"ip_allowlist": {
"type": "ip_range"
}
}
}
}
PUT my-index-000011/_doc/1?refresh
{
"expected_attendees": {
"gte": 10,
"lte": 20
},
"time_frame": {
"gte": "2015-10-31 12:00:00",
"lte": "2015-11-01"
},
"ip_allowlist": "192.168.0.0/16"
}
# term query
GET my-index-000011/_search
{"query":{"term":{"expected_attendees":{"value":12}}}}
# 时间范围查询是否匹配
GET my-index-000011/_search
{"query":{"range":{"time_frame":{"gte":"2015-10-31","lte":"2015-11-01","relation":"within"}}}}
# IP地址查询是否匹配
GET my-index-000011/_search
{"query":{"term":{"ip_allowlist":{"value":"192.124.1.100"}}}}
- 支持的类型参数:coerce(默认true)、boost(默认1.0)、
index(默认true)、store(默认false),所以在默认情况下,该类型字段支持可搜索,不可存储。
IP
- 描述:IP字段类型,类型值ip,支持索引或者存储IPv4或IPv6地址。
- 操作示例如下:
# 创建索引,Mapping包含ip类型
PUT my-index-000012
{
"mappings": {
"properties": {
"ip_addr": {
"type": "ip"
}
}
}
}
#索引数据
PUT my-index-000012/_doc/1
{"ip_addr":"192.168.1.1"}
#查询ip数据
GET my-index-000012/_search
{"query":{"term":{"ip_addr":"192.168.0.0/16"}}}
- 支持的类型参数:boost(默认1.0)、doc_values(默认true)、ignore_malformed(默认false)、 index(默认true)、null_value(默认null)、store(默认false),所以在默认情况下,该类型字段支持可搜索,不可存储。
2.4 聚合数据类型
Histogram
- 描述:直方图类型,类型值histogram,用于存储表示直方图的预聚合数字数据的字段,这个数据是用两个成对的数组定义的:
(1)一个double类型数组values,表示直方图的桶数,这些值必须按升序提供。
(2)一个对应的integer类型计数数组counts,表示每个桶的个数,这些数字必须是正的或零。
因为values数组中的元素对应于count数组中相同位置的元素,所以这两个数组必须具有相同的长度。 - 操作示例如下:
# my_histogram, 直方图类型字段存储百分比数据
# my_text, keyword类型字段存储直方图标题
PUT my-index-000013
{
"mappings" : {
"properties" : {
"my_histogram" : {
"type" : "histogram"
},
"my_text" : {
"type" : "keyword"
}
}
}
}
# 存储预聚合数据到histogram_1 和 histogram_2
PUT my-index-000013/_doc/1
{
"my_text" : "histogram_1",
"my_histogram" : {
"values" : [0.1, 0.2, 0.3, 0.4, 0.5],
"counts" : [3, 7, 23, 12, 6]
}
}
PUT my-index-000013/_doc/2
{
"my_text" : "histogram_2",
"my_histogram" : {
"values" : [0.1, 0.25, 0.35, 0.4, 0.45, 0.5],
"counts" : [8, 17, 8, 7, 6, 2]
}
}
- 对于每个文档,直方图类型字段只能存储values数组和count数组组成的一对,不支持嵌套数组。并且由于直方图数据没有被索引,所以只能使用直方图类型字段用于聚合和查询。直方图类型字段不支持排序。
- 直方图类型字段数据被存储为二进制文档值,而不是索引。它的大小以字节为单位最多为13 * numValues,其中numValues是所提供数组的长度。
2.5 文本搜索类型
Text
- 描述:文本类型,全文索引的字段,例如电子邮件的正文或产品的描述。这些字段将被分析,也就是说,它们将通过分析器在索引之前将字符串转换为单个term的集合。这个分析过程允许Elasticsearch在每个全文字段中搜索单个单词。文本类型字段不用于排序,也很少用于聚合(尽管重要文本聚合是一个明显的例外)。如果需要索引结构化的内容,如电子邮件地址、主机名、状态码或标签,那么尽可能使用keyword类型字段。
- 操作示例如下:
PUT my-index-000014
{
"mappings": {
"properties": {
"full_name": {
"type": "text"
}
}
}
}
PUT my-index-000014/_doc/1
{"full_name":"Johnny Lu"}
- 支持的类型参数:
(1)analyzer:在索引时和搜索时都应该用于文本字段的分析器(除非被search_analyzer覆盖)。默认为standard分析器,或index分析器。
(2)其他参数:boost(默认1.0)、eager_global_ordinals(默认false)、fielddata(默认false)、fielddata_frequency_filter(默认加载所有值)、fields、 index(默认true)、index_options、index_prefixes、index_phrases、norms(默认true)、position_increment_gap、store(默认false)、search_analyzer、search_quote_analyzer(默认search_analyzer)、similarity(默认BM25)、term_vector(默认没有)、meta。
completion
- 描述:完成类型,类型值completion,用于自动完成suggestions。
- 操作示例如下:
PUT my-index-000015
{
"mappings": {
"properties": {
"suggest": {
"type": "completion"
},
"title": {
"type": "keyword"
}
}
}
}
- 支持的类型参数:
(1)analyzer:索引时要使用的分析器,默认为simple分析器。
(2)search_analyzer:搜索时要使用的分析器,默认与参数analyzer一样。
(3)其他参数:preserve_separators(默认true)、preserve_position_increments(默认true)、max_input_length。
search_as_you_type
- 描述:类型值search_as_you_type,search_as_you_type字段类型类似文本类型,经过优化,它会创建一系列子字段,通过对这些子字段进行分析,并找出通过部分来匹配整个文本值的有效term,将其索引。该类型的字段既支持前缀补全,也支持中缀补全。
- 操作示例如下:
PUT my-index-000016
{"mappings":{"properties":{"my_field":{"type":"search_as_you_type"}}}}
PUT my-index-000016/_doc/1?refresh
{"my_field":"quick brown fox jump lazy dog"}
GET my-index-000016/_search
{
"query": {
"multi_match": {
"query": "brown f",
"type": "bool_prefix",
"fields": [
"my_field",
"my_field._2gram",
"my_field._3gram"
]
}
}
}
- 子字段中shingles的大小可以使用max_shingle_size映射参数来配置。默认值为3,该参数的有效值为整数值2 - 4(含整数值)。
- 支持的类型参数:
(1)analyzer:在索引时和搜索时都应该用于文本字段的分析器(除非被search_analyzer覆盖)。默认为standard分析器,或index分析器。
(2)search_analyzer:搜索时要使用的分析器,默认与参数analyzer一样。
(3)其他参数: index(默认true)、norms(默认true)、store(默认false)、search_quote_analyzer(默认search_analyzer)、similarity(默认BM25)、term_vector(默认没有)。
Token count
描述:标记计数类型,类型值token_count,token_count类型的字段实际上是一个integer字段,该类型字段分析接受的字符串值,统计出字符串中标记的数量并对其进行索引。
操作示例如下:
PUT my-index-000017
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"length": {
"type": "token_count",
"analyzer": "standard"
}
}
}
}
}
}
PUT my-index-000017/_doc/1
{ "name": "John Smith" }
PUT my-index-000017/_doc/2
{ "name": "Rachel Alice Williams" }
GET my-index-000017/_search
{"query":{"term":{"name.length":3}}}
- 支持的类型参数:
(1)analyzer:用来分析字符串值的分析器。必需的。为了获得最佳性能,请使用不带tokens过滤器的分析器。
(2)enable_position_increments:指示是否应该计算位置增量。如果不计算分析器过滤器删除的tokens,则设置为false。默认值为true。
(3)其他参数:boost(默认1.0)、doc_values(默认true)、index(默认true)、null_value(默认null)、store(默认false)。
2.6 文档排名类型
Dense vector
- 描述:密集向量场类型,类型值dense_vector,dense_vector类型字段存储浮点值的密集向量。向量的最大维数不应超过2048,dense_vector类型字段是一个单值字段。这些向量可用于文档评分。例如,文档分数可以表示给定查询向量和索引文档向量之间的距离。
- 操作示例如下:
PUT my-index-000018
{
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 3
},
"my_text" : {
"type" : "keyword"
}
}
}
}
PUT my-index-000018/_doc/1
{"my_text":"text1","my_vector":[0.5,10,6]}
PUT my-index-000018/_doc/2
{"my_text":"text2","my_vector":[-0.5,10,10]}
- 支持的类型参数:
dims:向量的维数,是必需的参数
Rank feature
- 描述:特征排名类型,类型值rank_feature,rank_feature类型字段只接受数字来建立索引,以便后续使用rank_feature查询时来增强查询中的文档。
- 操作示例如下:
PUT my-index-000019
{
"mappings": {
"properties": {
"pagerank": {
"type": "rank_feature"
},
"url_length": {
"type": "rank_feature",
"positive_score_impact": false
}
}
}
}
PUT my-index-000019/_doc/1
{"pagerank":8,"url_length":22}
PUT my-index-000019/_doc/2
{"pagerank":9,"url_length":23}
# 使用rank_feature查询,与值正相关排序
GET my-index-000019/_search
{"query":{"rank_feature":{"field":"pagerank"}}}
- rank_feature类型字段只支持单值字段和严格正数值。多值字段和负数值将被拒绝。
- rank_feature类型字段不支持查询、排序或聚合。只能在rank_feature查询中使用。
- rank_feature类型字段仅保留9位有效位以保证精度,换算成相对误差约为0.4%。
- 与分数负相关的排名特性应该将参数positive_score_impact设置为false(默认为true)。rank_feature查询将使用它来修改评分公式,使得分随着特征值的增加而减少,而不是增加。例如在网络搜索中,url长度是一个常用的特征,它与分数呈负相关。
Rank features
- 描述:特征集排名类型,类型值rank_features,rank_features字段可以为数值特征向量建立索引,以便后续使用rank_feature查询来增强查询中的文档。它类似于rank_feature数据类型,rank_features更适合在特性列表稀疏的情况下使用。
- 操作示例如下:
PUT my-index-000020
{
"mappings": {
"properties": {
"topics": {
"type": "rank_features"
}
}
}
}
PUT my-index-000020/_doc/1
{"topics":{"politics":20,"economics":50.8}}
PUT my-index-000020/_doc/2
{"topics":{"politics":5.2,"sports":80.1}}
GET my-index-000020/_search
{"query":{"rank_feature":{"field":"topics.politics"}}}
- rank_features类型字段必须是具有字符串键和严格为正数值的散列。
- rank_features类型字段只支持单值特性和严格正数值。多值字段和零值或负数值将被拒绝
- rank_features类型字段不支持查询、排序或聚合。只能在rank_feature查询中使用。
- rank_features类型字段仅保留9位有效位以保证精度,换算成相对误差约为0.4%。
2.7 空间数据类型
Geo point
- 描述:地理空间类型,类型值geo_point,geo_point类型的字段接受经纬度对。
- 可用5种数据类型表示geo_point数据类型,操作示例如下:
PUT my-index-000021
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
# 使用object对象类型,指定lat和lon,表示geo_point:
PUT my-index-000021/_doc/1
{"text":"Geo-point as an object","location":{"lat":41.12,"lon":-71.34}}
# 使用字符串格式:“lat,lon” ,表示geo_point:
PUT my-index-000021/_doc/2
{"text":"Geo-point as a string","location":"41.12,-71.34"}
# 使用geohash字符串,表示geo_point
PUT my-index-000021/_doc/3
{"text":"Geo-point as a geohash","location":"drm3btev3e86"}
# 使用数组形式:[lon, lat],表示geo_point
PUT my-index-000021/_doc/4
{"text":"Geo-point as an array","location":[-71.34,41.12]}
# 使用文本点表示,格式为“POINT(lon lat)”,表示geo_point
PUT my-index-000021/_doc/5
{"text":"Geo-point as a WKT POINT primitive","location":"POINT (-71.34 41.12)"}
GET my-index-000021/_search
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 42,
"lon": -72
},
"bottom_right": {
"lat": 40,
"lon": -74
}
}
}
}
}
- 支持的类型参数:
(1)ignore_malformed:如果值为true,则忽略有缺陷的地理点。如果值为false(默认),遇到格式不正确的地理点会抛出一个异常并拒绝整个文档。
(2)ignore_z_value:如果值为true(默认的),三维空间点将被接受(存储在source中),但只有纬度和经度值将被索引;第三个维度被忽略。如果为false,除了纬度和经度以外,遇到其他任何地理点都会抛出异常并拒绝整个文档。
(3)null_value:接受一个geopoint值,它代替任何显式的空值。默认值为null,这意味着该字段被视为丢失。
Point
- 描述:点数据类型,类型值point,point类型用于对落在二维平面坐标系中的任意x、y对的索引和搜索。
- 指定一个point类型有四种方式,操作示例如下:
PUT my-index-000022
{
"mappings": {
"properties": {
"location": {
"type": "point"
}
}
}
}
# 使用object对象类型,指定x和y,表示point:
PUT my-index-000022/_doc/1
{"text":"Point as an object","location":{"x":41.12,"y":-71.34}}
# 使用字符串格式:“x,y” ,表示point:
PUT my-index-000022/_doc/2
{"text":"Point as a string","location":"41.12,-71.34"}
# 使用数组形式:[x, y],表示point
PUT my-index-000022/_doc/3
{"text":"Point as an array","location":[41.12,-71.34]}
# 使用文本点表示,格式为“POINT(x y)”,表示geo_point
PUT my-index-000022/_doc/4
{"text":"Point as a WKT POINT primitive","location":"POINT (41.12 -71.34)"}
- 目前还不能直接对point类型数据进行排序或字段搜索。只能通过_source字段搜索。
- 支持的类型参数:
(1)ignore_malformed:如果值为true,则忽略有缺陷的点。如果值为false(默认),遇到格式不正确的点会抛出一个异常并拒绝整个文档。
(2)ignore_z_value:如果值为true(默认的),三个维度点将被接受(存储在source中),但只有x和y的值将被索引;第三个维度被忽略。如果为false,除了x和y以外,遇到其他任何维度都会抛出异常并拒绝整个文档。
(3)null_value:接受一个point值,它代替任何显式的空值。默认值为null,这意味着该字段被视为丢失。
2.8 其他类型
Percolator
- 描述:过滤器类型,类型值percolator,percolator类型将json结构解析为原生查询并存储该查询,以便percolate query可以使用它来匹配所提供的文档。
- 操作示例如下:
# 配置percolator字段类型
PUT my-index-01
{
"mappings": {
"properties": {
"query" : {
"type" : "percolator"
},
"body" : {
"type": "text"
}
}
}
}
# 为索引定义一个别名,这样,在重索引系统/应用程序的情况下,不需要更改查询索引名
POST _aliases
{
"actions": [
{
"add": {
"index": "my-index",
"alias": "queries"
}
}
]
}
# 将原生查询解析并索引,查询条件为文档字段body包含"quick brown fox"之一
PUT queries/_doc/1?refresh
{
"query" : {
"match" : {
"body" : "quick brown fox"
}
}
}
# percolate查询,所提供文档的字段名与查询条件中的字段名(如body)必须相同
GET /queries/_search
{
"query": {
"percolate" : {
"field" : "query",
"document" : {
"body" : "fox jumps over the lazy dog"
}
}
}
}
3. 结语
这里只是简单介绍了Elasticsearch的部分字段类型,如有需要,可通过Elasticsearch官方文档进一步了解更多数据类型。