es的常用字段类型和查询


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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM