Elasticsearch支持一系列不同的数据类型来定义文档字段,分为核心数据、复杂数据、地理数据、专门数据类型。
核心数据:
复杂数据类型:
地理数据类型:
专门数据类型
字符串数据类型的字段接受文本值,可以分为如下两种:
示例:全文本(可以分词)字段和关键字(不可以分词)字段
PUT /myindex2
{
"mappings": {
"test2":{
"properties": {
"full_name":{"type": "text"},
"status":{"type": "text", "index": false}
}
}
}
}
其中full_name字段是一个可分词的全文本类型字段——index;默认是analyzed。status字段是一个不可分词的关键字段。
同一个字段同时拥有全文本和关键字两个版本非常游泳:一个用于全文搜索,另一个用于聚合和排序。
PUT /myindex2
{
"mappings": {
"test2":{
"properties": {
"number_of_bytes": {"type": "integer"},
"time_in_seconds":{"type": "float"}
}
}
}
}
数字型字段参数:
JSON没有日期型数据类型,所以在Elasticsearch中,日期可以是:
通常,日期被转换为UTC(如果时区被指定)但是存储为代表时间毫秒数的长整型数。可以自定义时间格式,如果没有指定格式,则使用默认值:
strict_date_optional_time||epoch_millis
这意味着接受任何时间戳的日期值。
PUT /myindex2
{
"mappings": {
"test2":{
"properties": {
"date":{"type": "date"}
}
}
}
}
PUT /myindex2/test2/1
{
"date":"2015-01-01"
}
PUT /myindex2/test2/2
{
"date":"2015-01-01T12:10:30Z"
}
PUT /myindex2/test2/3
{
"date":"1420070400001"
}
布尔字段接受true或false值,也可以接受代表真或假的字符串和数字:
false,"false","off","no","0",""(空串),0,0.0
PUT /myindex2
{
"mappings": {
"test2":{
"properties": {
"is_published":{"type": "boolean"
}
}
}
}
}
PUT /myindex2/test2/1
{
"is_published": true
}
二进制数据类型接受Base64编码字符串的二进制值。字段不以默认方式存储而且不能搜索:
PUT /myindex2
{
"mappings": {
"test2": {
"properties": {
"name":{"type": "text"},
"blob":{"type": "binary"}
}
}
}
}
PUT /myindex2/test2/1
{
"name":"Some binary blob",
"blob": "U29tZSBiaW5hcnkgYmxvYg=="
}
Base64编码二进制值不能嵌入换行符\n
。二进制数据类型的字段参数如下:
在Elasticsearch中,没有专门的数组类型。每个字段默认可以包含零个或多个值,然而,数组中的所有值都必须是相同的数据类型。
注意:
无法对数组中的每一个对象进行单独的查询。
null_value
配置替换掉或者忽略掉JSON文档是天然分层的:文档可以包含内部对象。同样,内部对象也可以包含内部对象。
对象数据类型的参数如下所示:
嵌套数据类型是对象数据类型一个专门的版本,用来使一组对象被单独地索引和查询。
(1)对象数组是如何摊平的
Lucene没有内部对象的概念,所以Elasticsearch利用简单的列表存储字段名和值,将对象层次摊平。
PUT /myindex2/test2/1
{
"group":"fans",
"user":[
{"first":"John","last":"Smith"},
{"first":"Alice","last":"White"}
]
}
//转换为内部文档,结构如下
{
"group":"fans",
"user.first":["alice", "john"],
"user.last":["smith", "white"]
}
user.first和user.last字段存在多值字段中,alice和white的关联性丢失了。这个文档可能错误匹配到关于alice和smith的查询。
(2)对一组对象使用嵌套字段
如果需要对一组对象进行索引而且保留数组中每个对象的独立性,可以使用嵌套数据类型而不是对象数据类型。本质上,嵌套对象将数组中的每个对象作为分离出来的隐藏文档进行索引。这也意味着每个嵌套对象可以独立于其它对象被查询:
PUT /myindex2
{
"mappings": {
"test2":{
"properties": {
"user":{"type": "nested"}
}
}
}
}
PUT /myindex2/test2/1
{
"group":"fans",
"user":[
{"first":"John","last":"Smith"},
{"first":"Alice","last":"White"}
]
}
可以根据对象进行搜索,但对象的条件要全匹配才能搜到:
POST /myindex2/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{"match":{"user.first":"Alice" }},
{"match":{"user.last":"White" }}
]
}
}
}
}
}
嵌套数据类型的字段参数如下:
地理点数据类型字段接受经纬度,可用于:
示例:指定类型为地理位置数据类型
PUT /myindex2
{
"mappings": {
"test2":{
"properties": {
"location":{"type": "geo_point"}
}
}
}
}
存储地理位置数据有4种不同方式:
//地理点参数形如对象参数,拥有纬度和经度键值对
PUT /myindex2/test2/1
{
"text":"Geo-point as an object",
"location":{"lat":41.12,"lon":-71.34}
}
//字符串地理点参数的格式为"纬度,经度"
PUT /myindex2/test2/2
{
"text":"Geo-point as a string",
"location": "41.12,-71.34"
}
//散列地理点参数
PUT /myindex2/test2/3
{
"text":"Geo-point as a geohash",
"location": "drm3btev3e86"
}
//地理点数组参数,格式为 [经度,纬度]
PUT /myindex2/test2/4
{
"text":"Geo-point as a array",
"location": [-71.34,41.12]
}
不常用,不做介绍…
IPv4字段本质上是一个长整型字段,接受IPv4地址并作为长整型进行索引。
PUT /myindex2
{
"mappings": {
"test2":{
"properties": {
"ip_addr":{"type": "ip"}
}
}
}
}
PUT /myindex2/test2/1
{
"ip_addr":"192.168.1.1"
}
单词计数型字段本质上是一个整数型字段,接受并分析字符串值,然后索引字符串中单词的个数。
PUT /myindex2
{
"mappings": {
"test2":{
"properties": {
"name":{
"type": "text",
"fields": {
"length":{"type":"token_count","analyzer":"standard"}
}
}
}
}
}
}
PUT /myindex2/test2/1
{
"name": "John Smith"
}
严格来说,单词计数类型计算位置增量而不是统计单词。这意味着即使分析器过滤掉一部分单词,它们也会被包含在计数中。