【ElasticSearch】es索引、映射、文档基本操作&复杂查询
创始人
2024-11-09 22:35:38

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的ElasticSearch专栏,本篇博客由B战尚硅谷的ElasticSearch视频总结而来,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

🌆内容速览

  • 1 es数据格式
  • 2 es基础操作
    • 2.1 索引的增删查
      • 2.1.1 创建索引
      • 2.1.2 查询索引
      • 2.1.3 删除索引
    • 2.2 映射操作
      • 2.2.1 创建映射
      • 2.2.2 查看映射
    • 2.3 文档的增删改查
      • 2.3.1 创建文档
      • 2.3.2 查询文档
      • 2.3.3 修改文档
      • 2.3.4 删除文档
  • 3 复杂查询
    • 3.1 条件分页查询
      • 3.1.1 查询所有
      • 3.1.2 条件查询
      • 3.1.3 分页条件查询
      • 3.1.4 指定字段返回
      • 3.1.5 指定字段排序
    • 3.2 多字段查询
      • 3.2.1 and条件
      • 3.2.2 or条件
      • 3.2.3 值范围查询
      • 3.2.4 全文检索、完全匹配
      • 3.2.5 高亮返回
    • 3.3 函数查询
      • 3.3.1 分组group by
      • 3.3.2 求和sum
      • 3.3.3 求平均值avg
      • 3.3.4 最大值max
      • 3.3.5 最小值min
      • 3.3.6 一次返回count/max/min/avg/sum
      • 3.3.7 去重后取总数

1 es数据格式

  Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,可以将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比。ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行。在这里插入图片描述

需要注意的是:这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个type,Elasticsearch 7.X 中, Type 的概念已经被删除。

2 es基础操作

2.1 索引的增删查

2.1.1 创建索引

  对比关系型数据库,创建索引就等同于创建数据库。通过apifox等工具,向 ES 服务器发 PUT 请求即为创建索引
http://服务器ip:9200/索引名
  
在这里插入图片描述

2.1.2 查询索引

查询指定索引

GET 请求即为查询指定索引
在这里插入图片描述

查看所有的索引信息

GET 请求
http://服务器ip:9200/_cat/indices?v
在这里插入图片描述

2.1.3 删除索引

DELETE 请求即为删除指定索引
在这里插入图片描述

2.2 映射操作

  映射就像是mysql数据表中对字段的限制一样,映射可以指定文档的类型以及能否使用索引

2.2.1 创建映射

PUT 请求
http://服务器ip:9200/索引名/_mapping

{     "properties": {         "title": {             "type": "text",             "index": true         },         "category": {             "type": "keyword",             "index": true         },         "images": {             "type": "text",             "index": false         },         "price": {             "type": "long",             "index": true         }     } } 

在这里插入图片描述
📌 index的值若为false的话,即不可被索引,无法通过match等方式进行匹配
📌 store:是否将数据进行独立存储,默认为 false。获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
📌 analyzer:分词器,这里的 ik_max_word 即使用 ik 分词器,后面讲解

2.2.2 查看映射

GET 请求
http://服务器ip:9200/索引名/_mapping
在这里插入图片描述

2.3 文档的增删改查

2.3.1 创建文档

向指定索引中添加文档(随机id)

POST 请求
http://服务器ip:9200/索引名/_doc
在这里插入图片描述
📌与索引操作不同的一点是,post请求的请求体中必须包含JSON格式的数据

向指定索引中添加文档(指定id)
  如果通过以上请求创建文档的话,会对该文档返回一个随机生成的_id,后面需要通过该_id对文档进行查询。显而易见,这个随机生成的_id并不容易记忆,于是我们可以通过加一层请求的方式指定文档的_id进行创建

POST 请求
http://服务器ip:9200/索引名/_doc/id值在这里插入图片描述

2.3.2 查询文档

查询指定索引下的指定文档

GET 请求
http://服务器ip:9200/索引名/_doc/id值
在这里插入图片描述

查询指定索引下的所有文档

GET 请求
http://服务器ip:9200/索引名/_search
在这里插入图片描述

2.3.3 修改文档

覆盖性修改(全量更新)

PUT 请求
http://服务器ip:9200/索引名/_doc/id值
在这里插入图片描述
📌全量更新的请求体中需要是全部的字段及值,因为是覆盖性修改,如果缺值的话之前的字段值就会不见

字段修改(局部更新)

POST 请求
http://服务器ip:9200/索引名/_update/id值
在这里插入图片描述
📌局部更新只需要在doc中嵌套想要修改的字段及值,未指定的字段值将保持原状不变
📌如果doc中嵌套的字段在之前的文档中不存在的话,将会作为新的字段及值添加到该文档中

2.3.4 删除文档

DELETE 请求
http://服务器ip:9200/索引名/_doc/id值
在这里插入图片描述
📌如果重复删除或者删除一个不存在的文档,会返回result:not_found

3 复杂查询

3.1 条件分页查询

3.1.1 查询所有

GET 请求
http://服务器ip:9200/索引名/_search

{     "query": {         "match_all": {                      }     } } 

在这里插入图片描述

3.1.2 条件查询

GET 请求
http://服务器ip:9200/索引名/_search

{     "query": {         "match": {             "category": "华为"         }     } } 

在这里插入图片描述

3.1.3 分页条件查询

GET 请求
http://服务器ip:9200/索引名/_search

{     "query": {         "match": {             "category": "华为"         }     },     "from": 0,     "size": 2 } 

在这里插入图片描述

📌请求体中需要使用以下json形式进行分页条件查询,其中from字段表示从第几条数据开始查询,size字段表示一页返回几条数据
📌如果想要查询指定页数的分页数据,可以通过 (页码-1)*页数算出来from字段的值

3.1.4 指定字段返回

可以通过"_source"字段指定返回结果的字段值

{     "query": {         "match": {             "category": "华为"         }     },     "_source": ["title","category"] } 

在这里插入图片描述

3.1.5 指定字段排序

可以通过"sort"字段指定字段进行排序及其顺序,desc降序asc升序

{     "query": {         "match": {             "category": "华为"         }     },     "sort": {         "price": {             "order": "desc"         }     } } 

在这里插入图片描述

3.2 多字段查询

3.2.1 and条件

must = and,转sql  ——>   where category = "华为" and price = 10999 
{     "query": {         "bool": {             "must": [                 {                     "match": {                         "category": "华为"                     }                 },                 {                     "match": {                         "price": 10999                     }                 }             ]         }     } } 

3.2.2 or条件

should = or,转sql  ——>   where category = "华为" or category = "小米" 
{     "query": {         "bool": {             "should": [                 {                     "match": {                         "category": "华为"                     }                 },                 {                     "match": {                         "category": "小米"                     }                 }             ]         }     } } 

3.2.3 值范围查询

es对应英文全拼sql
gtgreater than>
gtegreater than or equal>=
ltless than<
lteless than or equal<=
以下es的json请求体转sql  ——>   where price >= 100 and price <= 4000 
{     "query": {         "bool": {             "filter": {                 "range": {                     "price": {                         "gte": 100,                         "lte": 4000                     }                 }             }         }     } } 

3.2.4 全文检索、完全匹配

全文检索
  使用“match”进行检索的话,会将条件“卡拉米”拆成单个的字,也就是说当所有数据中category字段包含以上三个字中的任何一个查出来。
  于是下面的这个json,把category为小米的文档全查出来了。如果"category": "华米"的话将查出来所有的category包含“华“和”米”的文档都查出来,也就是说小米和华为

{     "query": {         "match": {             "category": "卡拉米"         }     } } 

完全匹配
  如果将“match”改为“match_phrase”的话,就将是完全匹配。也就是说再使用以下json进行查询的话就会没有数据返回,除非换成“小米”或者“华为”这种全等的条件

{     "query": {         "match_phrase": {             "category": "华米"         }     } } 

3.2.5 高亮返回

"highlight"字段,"pre_tags"和"post_tags"属性分别是高亮标签的前置标签和后置标签,将fields中指定字段的满足match的字拼接标签高亮返回

{     "query": {         "match": {             "title": "华为"         }     },     "highlight": {         "pre_tags": "",         "post_tags": "",         "fields": {             "title": {}         }     } } 

在这里插入图片描述

📌由于match是全文检索,所以会将match里的字拆成单独的字进行高亮标签的拼接
📌不支持数字形式的高亮返回

3.3 函数查询

下述函数查询与高亮highlight正好相反,他们只支持数字类型字段的查询

3.3.1 分组group by

terms = group by,转sql  ——>   group by price 
{     "aggs": {         "price_groupby": {  // 自定义命名             "terms": {                 "field": "price"             }         }     } } 

📌上面不只能查出来分组统计的数量,还能查出来所有文档的详细信息,如果不想让其返回的话,可以使用上面分页的方式"size":0

3.3.2 求和sum

sum = SUM( ),转sql  ——>   select SUM(price) 
{     "aggs": {         "sum_price": {             "sum": {                 "field": "price"             }         }     },     "size": 0 } 

3.3.3 求平均值avg

avg = AVG( ),转sql  ——>   select AVG(price) 
{     "aggs": {         "avg_price": {             "avg": {                 "field": "price"             }         }     },     "size": 0 } 

3.3.4 最大值max

max = MAX( ),转sql  ——>   select MAX(price) 
{     "aggs": {         "max_price": {             "max": {                 "field": "price"             }         }     },     "size": 0 } 

3.3.5 最小值min

min = MIN( ),转sql  ——>   select MIN(price) 
{     "aggs": {         "min_price": {             "min": {                 "field": "price"             }         }     },     "size": 0 } 

3.3.6 一次返回count/max/min/avg/sum

{     "aggs": {         "stats_price": {             "stats": {                 "field": "price"             }         }     },     "size": 0 } 

3.3.7 去重后取总数

cardinality = distinct + COUNT( ),转sql  ——>   select distinct COUNT(price) 
{     "aggs": {         "cardinality_price": {             "cardinality": {                 "field": "price"             }         }     },     "size": 0 } 

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...