一、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字段。
优秀博文参考
- elasticsearch6.4数据类型官方文档
- elasticsearch的数据类型使用规则
- elasticsearch 6.x Mapping设置