es的常用字段类型和查询
概要
在ES中,字段的类型很关键,毕竟无论是es还是传统的数据库,都无法弱化字段的类型。
在索引的时候,如果字段第一次出现,会自动识别某个类型。
那么如果一个字段已经存在了,并且设置为某个类型。再来一条数据,字段的数据不与当前的类型相符,就会出现字段冲突的问题。如果发生了冲突,在2.x版本会自动拒绝。
如果自动映射无法满足需求,就需要使用者自己来设置映射类型,因此,就需要使用者了解ES中的类型。
一、ES数据类型
1、分隔数据
ElasticSearch“真正用于分隔数据的结构“只有index,而没有type,type实际上作为了一个元数据(类似SQL中的id,作为额外的标识数据)来实现逻辑划分。
2、mapping
在index中还有一个mapping,mapping管理了整个index的各个字段的属性,也就是定义了整个index中document的结构。
GET test_alias/_mapping
3、ES数据类型
ES常用的数据类型可分为3大类:核⼼数据类型、复杂数据类型、专⽤数据类型
1)核心数据类型
(1)字符串类型: text, keyword
text类型:
a. 支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;
b. test类型最大支持的字符长度无限制,适合大字段存储;
使用场景:
存储全文搜索数据, 例如: 邮箱内容、地址、代码块、博客文章内容等。
默认结合standard analyzer(标准解析器)对文本进行分词、倒排索引。
默认结合标准分析器进行词命中、词频相关度打分。
keyword类型:
a. 不进行分词,直接索引,支持模糊、支持精确匹配,支持聚合、排序操作。
b. keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
使用场景:
存储邮箱号码、url、name、title,手机号码、主机名、状态码、邮政编码、标签、年龄、性别等数据。
用于筛选数据(例如: select * from x where status='open')、排序、聚合(统计)。
直接将完整的文本保存到倒排索引中。
(2)数字类型:long, integer, short, byte, double, float, half_float, scaled_float
(3)日期:date
(4)日期 纳秒:date_nanos
(5)布尔型:boolean
(6)Binary:binary
(7)Range: integer_range, float_range, long_range, double_range, date_range
二、es的常用命令
1、 cat 命令:
cat 命令是监控 es 的节点,内存,索引,分片,集群状态等一些基本信息
1 # 列出所有_cat命令 2 GET _cat/ 3 4 # 显示左右索引并按照存储大小排序 5 GET _cat/indices?v&s=store.size:desc 6 7 # 获取集群状态 8 GET _cat/health 9 10 # 当使用v参数是 会显示列名的详细信息 11 GET _cat/health?v 12 13 # 显示所有的node信息 14 GET _cat/nodes?v 15 16 # 只显示ip和load_5m这两列 17 GET _cat/nodes?v&h=ip,load_5m 18 19 # 通过json格式显示输出 20 GET _cat/indices?v&format=json&pretty
2、 精确值查找
term
1 GET test_alias/_search 2 { 3 "query": { 4 "term": { 5 "target_id": { 6 "value": "15464324" 7 } 8 } 9 } 10 }
3、范围检索
range
范围查询的符号:
gte 大于或等于
gt 大于
lte 小于或等于
lt 小于
例如:数组范围内的查询
1 GET book_shop/_search 2 { 3 "query": { 4 "range": { 5 "price": { 6 "gte": 40, 7 "lte": 80, 8 "boost": 2.0 // 设置得分的权重值(提升值), 默认是1.0 9 } 10 } 11 } 12 }
1 GET test_alias/_search 2 { 3 "query": { 4 "bool": { 5 "filter": [ 6 { 7 "terms": { 8 "expend_type": [ 9 1, 10 13 11 ] 12 } 13 }, 14 { 15 "term": { 16 "target_id": 2402483 17 } 18 }, 19 { 20 "range": { 21 "time": { 22 "gt": 1553217005, 23 "lt": 1553218095 24 } 25 } 26 } 27 ] 28 } 29 } 30 }
4、分词检索
match
match_all
4) Bool查询
Bool查询包括四种子句:must、filter、should、must_not
must, 返回的文档必须满足must子句的条件,并且参与计算分值
filter, 返回的文档必须满足filter子句的条件。但是跟must不一样的是,不会计算分值, 并且可以使用缓存
从上面的描述来看,如果只看查询的结果,must和filter是一样的。区别是场景不一样。如果结果需要算分就使用must,否则可以考虑使用filter
5、聚合查询
aggs
1) 给定target_id的值,查询同一个target_id下的expend_type为1或者13下的统计值
1 GET test_alias/_search 2 { 3 "size": 0, 4 "query": { 5 "bool": { 6 "must": [ 7 { 8 "terms": { 9 "expend_type": [ 10 1, 11 13 12 ] 13 } 14 }, 15 { 16 "terms": { 17 "target_id": [ 18 13906061, 19 13817056, 20 13904373, 21 13851977, 22 13851353 23 ] 24 } 25 } 26 ] 27 } 28 }, 29 "aggs": { 30 "phone_count": { 31 "terms": { 32 "field": "target_id" 33 } 34 } 35 } 36 }
查询结果为:
2) 给定target_id的值,查询expend_type分别为1和13下的统计值
1 GET test_alias/_search 2 { 3 "size": 0, 4 "query": { 5 "bool": { 6 "must": [ 7 { 8 "terms": { 9 "target_id": [ 10 13906061, 11 13817056, 12 13904373 13 ] 14 } 15 }, 16 { 17 "terms": { 18 "expend_type": [ 19 1, 20 13 21 ] 22 } 23 } 24 ] 25 } 26 }, 27 "aggs": { 28 "target": { 29 "terms": { 30 "field": "target_id" 31 }, 32 "aggs": { 33 "type": { 34 "terms": { 35 "field": "expend_type" 36 } 37 } 38 } 39 } 40 } 41 }
查询结果为:
1 { 2 "took" : 2, 3 "timed_out" : false, 4 "_shards" : { 5 "total" : 9, 6 "successful" : 9, 7 "skipped" : 0, 8 "failed" : 0 9 }, 10 "hits" : { 11 "total" : { 12 "value" : 620, 13 "relation" : "eq" 14 }, 15 "max_score" : null, 16 "hits" : [ ] 17 }, 18 "aggregations" : { 19 "target" : { 20 "doc_count_error_upper_bound" : 0, 21 "sum_other_doc_count" : 0, 22 "buckets" : [ 23 { 24 "key" : 13906061, 25 "doc_count" : 502, 26 "type" : { 27 "doc_count_error_upper_bound" : 0, 28 "sum_other_doc_count" : 0, 29 "buckets" : [ 30 { 31 "key" : 1, 32 "doc_count" : 502 33 } 34 ] 35 } 36 }, 37 { 38 "key" : 13817056, 39 "doc_count" : 62, 40 "type" : { 41 "doc_count_error_upper_bound" : 0, 42 "sum_other_doc_count" : 0, 43 "buckets" : [ 44 { 45 "key" : 1, 46 "doc_count" : 62 47 } 48 ] 49 } 50 }, 51 { 52 "key" : 13904373, 53 "doc_count" : 56, 54 "type" : { 55 "doc_count_error_upper_bound" : 0, 56 "sum_other_doc_count" : 0, 57 "buckets" : [ 58 { 59 "key" : 1, 60 "doc_count" : 56 61 } 62 ] 63 } 64 } 65 ] 66 } 67 } 68 }
参考链接: https://cloud.tencent.com/developer/article/1496106