ES基础命令(参照mysql)
一 基础ES命令1、http://localhost:9200 先当于查看mysql数据库本地连接信息2、向ES 服务器发 PUT 请求http://127.0.0.1:9200/shopping;幂等性意味着不会重复发送,我们可以把一个索引shopping抽象成一个数据库中唯一的一张表IndexTable;这里相当于做创建数据库的操作3、向 ES 服务器发 GET 请求 : http://127
一 基础ES命令
1、http://localhost:9200 先当于查看mysql数据库本地连接信息,这里是查看本地es链接的信息
这里查看的前提是启动es服务器,Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单,以下我们所有的es命令本质上都是es开放给我们的接口,我们执行命令本质上那就是请求这些接口,来对es中的数据做增删改查,得到的结果也是es接口,而且这些接口还是restful类型的,这样更加简便清晰
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 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:
问题
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 => 更新操作
更多推荐
所有评论(0)