Elastic Search 属性类型

 2022-07-30    0 条评论    12452 浏览

es

ES所有属性类型

  • 字符类型 text,keyword
  • 整数类型 integer,long,short,byte
  • 浮点类型 double,float,half_float,scaled_float
  • 逻辑类型 boolean
  • 日期类型 date
  • 范围类型 range
  • 二进制类型 binary
  • 复合类型 数组类型 array
  • 对象类型 object
  • 嵌套类型 nested
  • 地理类型 地理坐标类型 geo_point
  • 地理地图 geo_shape
  • 特殊类型 IP类型 ip
  • 范围类型 completion
  • 令牌计数类型 token_count
  • 附件类型 attachment
  • 抽取类型 percolator

举例

字符类型

字符类型可以是text与keyword。 text为文本类型,会被分词。keyword不会被分词,会被当做全值key进行匹配。

从索引的mapping信息中,能看到字段对应的数据类型 字段名:content 类型:text ignore_above": 256表示当字段长度超过256的时候,只存储不索引 keyword:表示二进制索引,全值匹配

"content": {
	"type": "text",
	"fields": {
		"keyword": {
			"ignore_above": 256,
			"type": "keyword"
		}
	}
},

当存值长度小于256的时候,可以被检索。当存值大于256的时候,未被构建索引,无法检索


日期类型

date类型默认可以为时间戳(毫秒值),也可以是timestamp格式时间。 查询时传入两种时间都可以,但是因时区导致的查询不准确的问题。

    "mappings": {
        "_source": {},
        "properties": {
            "time": {
                "type": "date"
            },
            "@timestamp": {
                "type": "date"
            }
        }
    }
ES-查询-时间类型timestamp时区问题

ES存储date类型时,可以存储的为timestamp格式的数据,也可以直接存时间戳。 例如:

ES默认时UTC时区,当数据为timestamp时,而查询条件为时间戳时,会相差8小时。 例如: 有数据存储格式为timestamp格式如下

使用2022-07-29 11:40:59~2022-07-29 11:50:59区间的时间戳查询,查询不到。而将查询时间戳都加8小时后,则能查询到。

原因 ES,timestamp格式数据转化为时间戳时,使用了UTC时区。而UTC比中国的东八区早了8小时。

所以查询时:

  • 需要针对ES的timestamp数据时间,将时间戳增加8小时。
  • 或者直接使用timestamp格式进行查询。
  • 或者使用其他时间格式查询,但是需要指定格式,指定方式为:"format": "yyyy-MM-dd HH:mm:ss"
{
    'query': {
        'bool': {
            'filter': [
                {
                    'range': {
                        'time': {
                            'gt': star,
                            'lte': end,
                            'format': 'yyyy-MM-dd HH:mm:ss'
                        }
                    }
                }
            ]
        }
    }
}

IP类型

ES对IP类型的存储
  • ES支持多种字段存储类型,包括IP类型
  • ES对IP支持IPV4与IPV6。
  • ES属性既可以是单个IP,也可以是数组ip。
  • 但是要注意IP一定要是标准格式。

mapping设置如下

"ip": {
    "type": "ip",
	# 是否可用于聚合
    "doc_values": True
},
"ip_array": {
    "type": "ip",
    "doc_values": True
}
ES对IP类型的检索

ES支持对IPv4与IPv6的范围检索

以IPv6为例,有数据如下所示:

{
	"end_ip": "fe80::e4d9:151e:5485:cf49",
	"from_ip": "fe80::e4d9:151e:5485:cf47"
},
{
	"end_ip": "fe80::e4d9:151e:5485:cf47",
	"from_ip": "fe80::e4d9:151e:5485:cf47"
}

那么通过对end_ip与from_ip做范围查询,就能实现多种筛选逻辑。

传入单个IP检索时:IP

包含关系:from_ip <= IP && IP <= end_ip

等于关系:from_ip = IP && IP = end_ip

不包含关系:IP <= from_ip || end_ip <= IP

当传入IP段进行检索时:IP_F IP_E 包含关系:IP_F <= from_ip && end_ip <= IP_E

交集关系:IP_E !< from_ip && end_ip !< IP_F 或者 IP_E >= from_ip && end_ip >= IP_F

无交集关系:IP_E < from_ip || end_ip < IP_F

IPV4逻辑与IPv6相同