Elasticsearch系列(4)Mapping之字段类型

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官方文档进一步了解更多数据类型。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343