ES基础命令(参照mysql)

 2023-09-11 阅读 21 评论 0

摘要:一 基础ES命令 1、http://localhost:9200 先当于查看mysql数据库本地连接信息,这里是查看本地es链接的信息 这里查看的前提是启动es服务器,Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来

一 基础ES命令

1、http://localhost:9200 先当于查看mysql数据库本地连接信息,这里是查看本地es链接的信息
在这里插入图片描述
这里查看的前提是启动es服务器,Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单,以下我们所有的es命令本质上都是es开放给我们的接口,我们执行命令本质上那就是请求这些接口,来对es中的数据做增删改查,得到的结果也是es接口,而且这些接口还是restful类型的,这样更加简便清晰

mysql数据库备份、2、向ES 服务器发 PUT 请求 http://127.0.0.1:9200/shopping;幂等性意味着不会重复发送,我们可以把一个索引shopping抽象成一个数据库中唯一的一张表IndexTable;这里相当于做创建数据库的操作

3、向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/_cat/indices?v 查看索引下所有请求相当于mysql下查看一个连接下的全部数据库show tables命令;
在这里插入图片描述
和目录下一一对应
在这里插入图片描述

需要补充的是:
4、向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping 相当于查看数据库的介绍信息,我们模拟插入数据

ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_doc/1

#请求参数
{"title":"华为手机","category":"华为","images":"http://www.gulixueyuan.com/hw.jpg","price":1999.00
}

添加个mapping映射结构

在这里插入代码片

具体信息如下

{"shopping": {  //索引名"aliases": {}, //别名"mappings": {  //映射"properties": {   //相关属性"category": {   //插入字段属性1"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"images": {  //插入字段属性2"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"price": { //插入字段属性3"type": "float"},"title": {  //插入字段属性4"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}},"settings": {    //设置信息"index": {  //索引信息"creation_date": "1643871853082","number_of_shards": "1",  //分片数量,值为1代表这是单点es并非分布式"number_of_replicas": "1", //副本数量,为1代表无副本"uuid": "EZ6F1oOESKWk0gK8OFcPWA", //索引uuid,索引唯一标识,目录存储"version": {"created": "7080099"},"provided_name": "shopping"  //索引名}}}
}

二 查询语句

GET请求:http://127.0.0.1:9200/shopping/_search/1

等价于select * from shopping where id = 1;

GET请求:http://127.0.0.1:9200/shopping/_search

等价于 select * from shopping;

查询语句1

GET http://127.0.0.1:9200/shopping/_search
{"query":{"match_all":{}},"from":0,"size":2
}
select * from shopping limit 0,2;

查询语句3

GET http://127.0.0.1:9200/shopping/_search
{"query":{"match_all":{}},"sort":{"price":{"order":"desc"}}}select * from shopping order by price desc;

查询语句4

GET http://127.0.0.1:9200/shopping/_search
{"query":{"bool":{"must":[{"match":{"category":"小米"}},{"match":{"price":3999.00}}]}}
}			
select * from shopping where `category`like '%小米%' AND  `price`=3999.90
注意点:bool代表这是一个多条件查询语句,must代表and关系即多个条件必须同时成立,与之相对的是should也就是相当于与逻辑,即多个条件满足其一即可,match如果对于text类型字段就相当于like模糊查询,而如果是对于keyword那么就相当于=查询

语句5
查找category为小米的文档,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search?q=category:小米(不安全),或者按下面的写法

http://127.0.0.1:9200/shopping/_search
{"query":{"match":{"category":"小米"}}}select * from shopping where category = 小米;注意:这里并不是完全等于,只要是包含小米

这是因为es在存储文档时会对text内容做分词操作,然后再存入倒排索引中去,也就是即使只用部分字段也能匹配到相关文档,如果你又elk使用经验就很好理解这个概念,因为这是理所当然的。再看一个复杂些的例子

http://127.0.0.1:9200/shopping/_search
{"query":{"match":{"category":"小华"}}}select * from shopping where category like %小% or category like %华%;
也就是把种类为华为和小米的手机全部筛选出来

如果我们不希望用分词进线匹配,而是希望完全匹配,那么就按如下

http://127.0.0.1:9200/shopping/_search
{"query":{"match_pharse":{"category":"小米"}}}select * from shopping where category like  小米;

语句6
source一定程度上可以看做是mysql中的表字段

http://127.0.0.1:9200/shopping/_search
{"query":{"match_all":{}},"_source":["title"]
}
select `title` from shopping;

语句7

http://127.0.0.1:9200/shopping/_search
{"query":{"match_all":{}},"sort":{"price":{"order":"desc"}}"size":2
}select * from shopping order by create_time desc limit 2;

语句8
注意点:must和filter都是相当于AND逻辑

http://127.0.0.1:9200/shopping/_search
{"query":{"bool":{"should":[{"match":{"category":"小米"}},{"match":{"category":"华为"}}],"filter":{"range":{"price":{"gt":2000}}}}}
}
select * from shopping where `category`like %小米% OR `category`like %华为%   AND  `price`='3999.90 AND price > 2000
{ "query": { "term": { "category": "华为" } } 
}select * from shoping where `category`='华为' ;
{ "query": { "terms": { "category": [ 华为, 小米] } } 
}select * from IndexTable where `categor`='华为' OR categor`='小米'  ;
{ "range": { "age": { "gte":  20, "lt":   30 } } 
}
select * from shopping where age between 20 and 30;
{"aggs":{//聚合操作"price_group":{//名称,随意起名"terms":{//分组"field":"price"//分组字段}}}}
select * from shopping group by price;
"aggs":{"price_avg":{//名称,随意起名"avg":{//求平均"field":"price"}}},"size":0
}
select avg('price') from shopping group by price	;

总结:es查询中的term,match,match_phase,query_string的区别

  • match:模糊匹配,需要指定字段名,但是输入会进行分词,比如"hello world"会进行拆分为hello和world,然后匹配,如果字段中包含hello或者world,或者都包含的结果都会被查询出来,也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。
  • 和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛。

Post/PUT请求

注意:post请求不具有幂等性

插入语句1
ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_doc/1

#请求参数
{"title":"华为手机","category":"华为","images":"http://www.gulixueyuan.com/hw.jpg","price":1999.00
}
insert into  shoppin values ('华为手机',bbb='华为',ccc='http://www.gulixueyuan.com/hw.jpg',price='1999.00')

注意
①如果没有指定id,即 ES 服务器发 POST 请求 http://127.0.0.1:9200/shopping/_doc

//由于没有指定数据唯一性标识(ID),默认情况下, ES 服务器会随机生成一个
insert into shopping  values (random(id),'华为手机','为','http://www.gulixueyn.com/hw.jpg',price='1999.00' );

②如果指定了id,那么也可以使用put请求来进行添加,但前提是添加的id是一个全新的,之前不存在的id,否则put就相当于做修改了

id不存在的情况,ES 服务器发 PUT 请求 http://127.0.0.1:9200/shopping/_doc/1

insert into shopping  values (random(id),'华为手机','为','http://www.gulixueyn.com/hw.jpg',price='1999.00' );

id已存在的情况,ES 服务器发 PUT 请求 http://127.0.0.1:9200/shopping/_doc/1

请求参数如下
{"title":"华为手机2","category":"华为2","images":"http://www.gulixueyuan.com/hw.jpg","price":1999.00
}那这样就相当于更新操作update shopping set title = '华为手机2' and category = '华为2' where id = 1;

③对于post请求,post请求本身是用于添加数据的,但是如果添加数据的主键索引中已存在,那么效果就和put一样,起到修改的效果

POST局部修改
向es服务器发送post类型的请求 http://127.0.0.1:9200/shopping/_update/1

{"doc": {"title":"小米手机","category":"小米"}
}

相当于直接把id=1的shopping索引的文档直接给更新了

插入语句2
在 Postman 中,向 ES 服务器发 POST 请求:http://127.0.0.1:9200/shopping/_update/1。

{"doc": {"title":"小米手机","category":"小米"}
}

这里和mysql不同,这里使用post根据主键插入是可以覆盖的,通过覆盖营造出更新的效果;

修改语句

Delete删除操作

DELETE 请求:http://127.0.0.1:9200/shopping/_doc/1

这个并不是简单的等价于delete from shooping where id =1;这里是逻辑删除,效果类似于
update shopping set flag = 1;//flag是逻辑标志位,1代表已删除,0代表还未删除

总结

bool 查询可以包含一个或多个查询字句如下
* must:必须匹配,且逻辑
* should:选择性匹配,与逻辑
* must_not:查询字句,必须不能匹配
* filter:必须匹配,和must类似match匹配需要具体情况具体分析,如果是keyword则必须完全匹配即等于号,如果是text那么只需要包含即可,因为keyword不能被分词,text文档时被分词后存入到倒排索引库中的 term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:

query和filter的区别

es中的term和match的区别

问题

http://127.0.0.1:9200/shopping/_search  => 查询全部操作
http://127.0.0.1:9200/shopping/_doc/1 => 查询id为1的操作
http://127.0.0.1:9200/shopping/_update  => 更新操作

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/49490.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息