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

    举个例子:

复制代码
 1 PUT /my_index
 2 {
 3   "mappings": {
 4     "properties": {
 5       "id": {
 6         "type": "keyword"
 7       },
 8       "title": {
 9         "type": "text",
10         "analyzer": "standard",
11         "fields": {
12           "keyword": {
13             "type": "keyword",
14             "ignore_above": 256
15           }
16         }
17       },
18       "content": {
19         "type": "text",
20         "analyzer": "english"
21       },
22       "author": {
23         "type": "keyword"
24       },
25       "publish_date": {
26         "type": "date",
27         "format": "yyyy-MM-dd HH:mm:ss||epoch_millis"
28       },
29       "tags": {
30         "type": "keyword"
31       }
32     }
33   }
34 }
复制代码

    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的常用命令

    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
复制代码

   三、ES的查找类型

   1. 精确值查找

   term

复制代码
 1 GET test_alias/_search
 2 {
 3   "query": {
 4     "term": {
 5       "target_id": {
 6         "value": "15464324"
 7       }
 8     }
 9   }
10 }
复制代码

    2. 范围检索

    range

    范围查询的符号:

    gte  大于或等于

    gt  大于

    lte 小于或等于

    lt   小于

    示例1:

复制代码
 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 }
复制代码

   示例2: 

复制代码
 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 }
复制代码

   3. 分词检索

   1)match查询

  • 用于全文检索(full-text search),对字段进行分词并查询与分词结果匹配的文档。
  • 适合用于非精确匹配的场景,例如搜索文本、描述、标题等字段。
  • 查询时会将查询条件分词,然后搜索字段中的内容与这些分词后的条件进行匹配。

    示例:

1 {
2   "query": {
3     "match": {
4       "title": "Elasticsearch introduction"
5     }
6   }
7 }

    2)match_all 查询

  • 匹配索引中的所有文档,通常用于查询所有数据或不加过滤条件的情况下使用。
  • 不会分词,直接返回所有文档,不计算相关性(默认会给所有文档一个相同的评分)。
  • 常用于需要返回所有文档,并结合排序或分页的场景   
 1 {
 2   "query": {
 5     "match_all": {}
 9   }
10 }

    说明:这个查询会返回索引中的所有文档,没有任何过滤条件。

    3) match和match_all的区别

  • match 查询是针对具体的字段进行搜索,适用于全文检索场景,带有分词和相关性计算
  • match_all 查询是返回所有文档的查询,不进行任何过滤操作,适用于需要检索全部数据的情况。 

    4.  Bool查询

    在 Elasticsearch 中,布尔查询是一种非常强大的复合查询类型,它允许你将多个查询条件组合在一起。通过布尔查询,你可以根据不同的需求来灵活地构建复杂的查询逻辑。布尔查询主要包括四种子句

    Bool查询包括四种子句:must、filter、should、must_not

    1) must

  • 查询子句必须匹配,类似于 SQL 中的 AND参与评分计算。
  • 文档必须满足该子句条件,才能被包含在结果集中。

    示例:

复制代码
1 {
2   "bool": {
3     "must": [
4       { "match": { "title": "Elasticsearch" } },
5       { "match": { "content": "search engine" } }
6     ]
7   }
8 }    
复制代码

    2)filter

  • 查询子句用作过滤器,类似于 SQL 中的 WHERE,但不参与评分计算。
  • 过滤器非常适合用于不需要参与相关性评分的精确匹配查询,例如时间范围、分类标签等。

    示例: 

1 {
2   "bool": {
3     "filter": [
4       { "term": { "status": "published" } },
5       { "range": { "publish_date": { "gte": "2023-01-01" } } }
6     ]
7   }
8 }

    从上面的描述来看,如果只看查询的结果,must和filter是一样的。区别是场景不一样。如果结果需要算分就使用must,否则可以考虑使用filter

    3) should

  • 查询子句可以匹配,但不是必须的,类似于 SQL 中的 OR
  • 如果至少一个 should 子句匹配,文档将被包含在结果集中。
  • 如果在 bool 查询中包含了多个 should 子句,并且没有 must 子句,则至少需要一个 should 子句匹配。

     示例: 

复制代码
1 {
2   "bool": {
3     "should": [
4       { "match": { "title": "Elasticsearch" } },
5       { "match": { "title": "Lucene" } }
6     ],
7     "minimum_should_match": 1
8   }
9 }
复制代码

    4) must_not

  • 查询子句不能匹配,类似于 SQL 中的 NOT
  • 文档不允许满足该子句条件。

    示例:

1 {
2   "bool": {
3     "must_not": [
4       { "term": { "status": "draft" } }
5     ]
6   }
7 }

    5. 聚合查询

    在 Elasticsearch 中,聚合查询(Aggregations)是一种强大的功能,用于从大量数据中生成统计信息、摘要和分析结果,而不仅仅是返回具体的文档。它的作用类似于 SQL 中的 GROUP BY 和各种聚合函数(如 COUNT、SUM、AVG 等),但更加灵活和强大。聚合查询可以帮助你对数据进行深层次的分析和汇总

    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

posted @   欢乐豆123  阅读(14407)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示