4、Elasticsearch数据类型

一、Elasticsearch时区类型

Elasticsearch时区划分:GMT 格林威治标准时间  默认时区UTC 世界协调时、DST 夏日节约时间、CST 中国标准时间

二、Elasticsearch Mapping结构

Mapping结构
类似于数据库中的表结构定义,主要作用如下:
1、定义Index下字段名(Field Name)
2、定义字段的类型,比如数值型,字符串型、布尔型、Date、geo_point
3、定义倒排索引的相关配置,比如是否索引、记录postion等
需要注意的是,在索引中定义太多字段可能会导致索引膨胀,出现内存不足和难以恢复的情况,下面有几个设置:
4、index.mapping.total_fields.limit:一个索引中能定义的字段的最大数量,默认是 1000
5、index.mapping.depth.limit:字段的最大深度,以内部对象的数量来计算,默认是20
6、index.mapping.nested_fields.limit:索引中嵌套字段的最大数量,默认是50

"mappings" : { "vem_order_type" : { "properties" : { "buyerPayMoney" : { "type" : "long" }}}}}

三、Elasticsearch 数据类型

1、字符串类型

Text  全文搜索(会被分词),如果进行聚合、排序计算需要开启fielddata进行内存预加载,不建议此使用方法

 Keyword  精确值进行过滤、排序、聚合等操作时, 就应该使用keyword类型,不会被分词

2、数字类型

数字类型如下:long、integer、short、byte、double、float、half_float、scaled_float尽可能选择范围小的数据类型, 字段的长度越短, 索引和搜索的效率越高,尽可能避免浮点类型,如果必须使用优先考虑使用带缩放因子的浮点类型.

Byte有符号的8位整数: 数字范围 [-128 ~ 127]

Short有符号的16位整数:数字范围 [-32768 ~ 32767]

Integer有符号的32位整数:范围: [−231 ~ 231-1]

Long有符号的64位整数: 范围: [−263 ~ 263-1]

Float32位单精度浮点数

Double64位双精度浮点数

Half_float16位半精度IEEE754浮点类型

Scaled_float缩放类型的的浮点数: 比如price字段只需精确到分, 57.34缩放因子为100, 存储结果为5734

3、Date日期格式

1、系统需要指定默认时区

如果时区未指定, 日期将被转换为UTC格式, 但存储的却是长整型的毫秒值,可以自定义日期格式, 若未指定, 则使用默认格式: strict_date_optional_time||epoch_millis

2、多种日期格式支持

多个格式使用双竖线||分隔, 每个格式都会被依次尝试, 直到找到匹配的.第一个格式用于将时间毫秒值转换为对应格式的字符串. 可选择以下格式:"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"

PUT website
{
    "mappings": {
        "blog": {
            "properties": {
                "date": {
                    "type": "date",  
                    "format": "yyyy-MM-dd HH:mm:ss"
                }
            }
        }
    }
}

日期纳秒

PUT my_index?include_type_name=true
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type": "date_nanos"}}}}}

4、布尔型boolean

可以接受表示真、假的字符串或数字: 真值: true,"1",假值: false, "0"

5、Binary:binary

 二进制类型是Base64编码字符串的二进制值, 不以默认的方式存储, 且不能被搜索. 有2个设置项:
 doc_values: 该字段是否需要存储到磁盘上、方便以后用来排序、聚合或脚本查询. 接受true和false(默认);
 store: 该字段的值是否要和_source分开存储、检索, 意思是除了_source中, 是否要单独再存储一份. 接受true或false(默认).

6、范围类数据类型Range

范围类数据类型有以下类型:integer_range、float_range、long_range、double_range、date_range
Range类型支持以下几种:
数据类型取值范围integer_range−231 ~ 231−1、long_range−263 ~ 263−1、float_range32位单精度浮点型double_range64位双精度浮点型date_range64位整数, 毫秒计时ip_rangeIP值的范围, 支持IPV4和IPV6, 或者这两种同时存在

Range数据结构:

PUT company
{
    "mappings": {
        "department": {
            "properties": {
                "expected_number": {  // 预期员工数
                    "type": "integer_range"
                },
                "time_frame": {       // 发展时间线
                    "type": "date_range", 
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                },
                "ip_whitelist": {     // ip白名单
                    "type": "ip_range"
                }
            }
        }
    }
}

Range数据添加

PUT company/department/1
{
    "expected_number" : {
        "gte" : 10,
        "lte" : 20
    },
    "time_frame" : { 
        "gte" : "2018-10-01 12:00:00", 
        "lte" : "2018-11-01"
    }, 
    "ip_whitelist": "192.168.0.0/16"
}

Range查询数据:

GET company/department/_search
{
    "query": {
        "term": {
            "expected_number": {
                "value": 12
            }
        }
    }
}
GET company/department/_search
{
    "query": {
        "range": {
            "time_frame": {
                "gte": "208-08-01",
                "lte": "2018-12-01",
                "relation": "within" 
            }
        }
    }
}


7、复杂数据类型

1、Object对象类型

JSON文档是分层的: 文档可以包含内部对象, 内部对象也可以包含内部对象.
Object数据结构:

PUT employee
{
    "mappings": {
        "developer": {
            "properties": {
                "name": { "type": "text", "index": "true" }, 
                "address": {
                    "properties": {
                        "region": { "type": "keyword", "index": "true" },
                        "location": {
                            "properties": {
                                "province": { "type": "keyword", "index": "true" },
                                "city": { "type": "keyword", "index": "true" }
                            }
                        }
                    }
                }
            }
        }
    }
}

Object数据存储:

//数据存储方式一
{
    "name":                       "ma_shoufeng",
    "address.region":             "China",
    "address.location.province":  "GuangDong", 
    "address.location.city":      "GuangZhou"
}


//数据存储方式二
PUT employee/developer/1
{
    "name": "ma_shoufeng",
    "address": {
        "region": "China",
        "location": {"province": "GuangDong", "city": "GuangZhou"}
    }
}

8、Nested对象嵌套类型

嵌套类型是对象数据类型的一个特例, 可以让Array类型的对象被独立索引和搜索.
1. 对象数组是如何存储的
1>添加数据:

PUT game_of_thrones/role/1
{
    "group": "stark",
    "performer": [
        {"first": "John", "last": "Snow"},
        {"first": "Sansa", "last": "Stark"}
    ]
}

2>内部存储结构:

{
    "group":              "stark",
    "performer.first": [ "john", "sansa" ],
    "performer.last":  [ "snow", "stark" ]
}

3> 存储分析:
可以看出, user.first和user.last会被平铺为多值字段, 这样一来, John和Snow之间的关联性就丢失了.
在查询时, 可能出现John Stark的结果.
2.用nested类型解决object类型的不足
如果需要对以最对象进行索引, 且保留数组中每个对象的独立性, 就应该使用嵌套数据类型.
—— 嵌套对象实质是将每个对象分离出来, 作为隐藏文档进行索引.
1> 创建映射:

PUT game_of_thrones
{
    "mappings": {
        "role": {
            "properties": {
                "performer": {"type": "nested" }
            }
        }
    }
}

2>添加数据:

PUT game_of_thrones/role/1
{
    "group" : "stark",
    "performer" : [
        {"first": "John", "last": "Snow"},
        {"first": "Sansa", "last": "Stark"}
    ]
}

3>检索数据:

GET game_of_thrones/_search
{
    "query": {
        "nested": {
            "path": "performer",
            "query": {
                "bool": {
                    "must": [
                        { "match": { "performer.first": "John" }},
                        { "match": { "performer.last":  "Snow" }} 
                    ]
                }
            }, 
            "inner_hits": {
                "highlight": {
                    "fields": {"performer.first": {}}
                }
            }
        }
    }
}

9、地理数据类型

1、Geo-point

geo_point 地理点类型:地理点类型用于存储地理位置的经纬度对, 可用于:查找一定范围内的地理点;通过地理位置或相对某个中心点的距离聚合文档;将距离整合到文档的相关性评分中;通过距离对文档进行排序.
添加映射:

PUT employee
{
    "mappings": {
        "developer": {
            "properties": {
                "location": {"type": "geo_point"}
            }
        }
    }
}


2、Geo-shape: geo_shape (地理形状类型)

地图的相交、包含,后续demo完善

10、 特殊数据类型

1、IP:  ip (IPv4 和 IPv6 地址)
2、Completion类型:completion (to provide auto-complete suggestions)
3、Token count:token_count (to count the number of tokens in a string)
4、mapper-murmur3:murmur3(to compute hashes of values at index-time and store them in the index)
5、mapper-annotated-text:annotated-text (to index text containing special markup (typically used for identifying named entities))
6、Percolator:(Accepts queries from the query-dsl)
7、Join:(Defines parent/child relation for documents within the same index)
8、Alias:(Defines an alias to an existing field.)
9、Rank feature:(Record numeric feature to boost hits at query time.)
10、Rank features:(Record numeric features to boost hits at query time.)
11、Dense vector:(Record dense vectors of float values.)
12、Sparse vector:(Record sparse vectors of float values.)
13、Search-as-you-type:(A text-like field optimized for queries to implement as-you-type completion)
14、Multi-fields
        Multi-fields 通常用来以不同的方式或目的索引同一个字段。比如,一个字符串类型字段可以同时被映射为 text 类型以用于全文检索、 keyword字段用于排序或聚合。又或者,你可以用standard分析器、english分析器和french分析器来索引同一个 text字段。
         
优秀博文参考

  1.  elasticsearch6.4数据类型官方文档
  2.  elasticsearch的数据类型使用规则
  3.  elasticsearch 6.x Mapping设置
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值