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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)