本人刚刚毕业参加工作不久,因为工作的需要学习了一下ES,因为做后端的都会使用数据库,都会写sql语句,所以在此整理了一下ES和MySQL语法的对比,记录一下自己的学习笔记,如果帮到你了,请评论支持一下,感谢。
ES语法基本操作,满满的干货,没有废话。不像别的博主说一些原理性的东西,因为我也不太懂,用就完了,大家来搜语法也只是想知道怎么用,没人想去知道原理性的东西
假设现在有一张wk_single_customer表,下面所有的语法都是对这张表进行操作
delete from wk_single_customer where id=21
POST wk_single_customer/_delete_by_query { "query":{ "term":{ "id":21 } } }
update wk_single_customer set referrerId= 15204,referrername='李四' where id=4104
此处注意·这个是固定写发法,ctx._source后跟要修改的字段,每修改一个字段都要写一次ctx._source
并且每个后面都要跟‘;’ 。query后面跟的就是条件了,bool是跟多个条件,must是必须满足的条件。后面会说到这些关键字
POST wk_single_customer/_update_by_query { "script": { "source": "ctx._source['referrerId']='15204'; ctx._source['referrername']='李四';" }, "query": { "bool": { "must": [ { "term": { "customerId": "4104" } } ] } } }
select * from wk_single_customer
GET /wk_single_customer/_search
上面是ES的一个简单的写法,也可以使用下面这种,下面这种多多少少有点多余了奥
GET /wk_single_customer/_search { "query": { "match_all": {} } }
select * from wk_single_customer where name = '张三'
GET /wk_single_customer/_search { "query": { "term": { "name": "张三" } } }
select * from wk_single_customer where age >= 15
关键字:gt/lt:大于/小于 gte/lte:大于等于/小于等于
GET /wk_single_customer/_search { "query": { "range": { "age": { "gte":15 } } } }
select * from wk_single_customer where age > 15 and name != '张三'
这里需要注意一下,bool是最外层的,多个条件都放在这里面,must是必须要满足的条件就是==,must_not是必须不满足的条件也就可以理解为!=。后面记得跟中括号哦,中括号里面是基础的查询条件。
GET /wk_single_customer/_search { "query": { "bool": { "must": [ { "range": { "age": { "gt": 15 } } } ], "must_not": [ { "term": { "name": "张三" } } ] } } }
select * from wk_single_customer order by age desc
升序asc,我不说你也懂
GET /wk_single_customer/_search { "sort": [ { "age": { "order": "desc" } } ] }
select * from wk_single_customer where age in(10, 14, 16)
记住term是等值,只有一个值。而terms是多值满足其中一个即可
GET /wk_single_customer/_search { "query": { "terms": { "age": ["10","14","16"] } } }
select * from wk_single_customer where id in(1, 3, 6)
ES每一行数据,即文档都会有一个id,如果指定某一列field值作为id,则该列field必须为唯一键,类似于MySQL的UK;不过不指定,ES会自动生成,常常为了更好的定位数据,会指定一列满足UK的field作为文档的id
GET /wk_single_customer/_search/ { "query": { "ids":{ "values":[1,3,6] } } }
姓名已”明明“结尾的
GET /wk_single_customer/_search/ { "query": { "regexp":{ "name":".*明明" } } }
select * from wk_single_customer where name like %朋%
关键字wildcard,小伙伴这个非常的实用哦
GET /wk_single_customer/_search { "query": { "wildcard": { "detail": { "name": "*朋*", } } } }
直接上干货,这里只列举了求和,其他都一样只是换个关键字(sum avg max min )
GET /wk_single_customer/_search { #查询条件,对哪些进行求和,这里条件就简单了,大家可以根据自己的需要加查询条件 "query":{ "terms": { "age": [12,13,14] } }, #固定语法 aggs "aggs" : { #随便起一个名字,相当于接收用 "ageSum" : { "sum": { #对哪个字段求和 "field" : "age" } } } }
查询ES时你会发现,因为查询结果是以JSON串展示的可能会很长很长,大部分都不是我们想看的,那么这个关键字就很重要了 _source
GET /wk_single_customer/_search { "_source": ["name","age"], "query": { "term": { "age": "13" } } }
ES特有的分词查询,非常的强大,ES是倒排索引所以这个特有的功能非常的牛B,由于我们公司并不是做电商的,所以说这个分词查询并没有使用,个人理解也比较片面 关键字:match
如果你安装了ik分词器(也就是中文分词器)他会将中文就行拆分 拆分成北京和天安门 凡是库里带有这两个词的任意一个的结果全部返回回来。当然如果你用的是ES自带的分词器,他会把中文一个字一个字的拆分,匹配任意一个字都返回。所以想用这个功能的话你要安装IK分词器哦(也就是中文分词器)
GET /wk_single_customer/_search { "query": { "match": { "address":"北京天安门" } } }
- match_phrase还是分词后去搜的
- 目标文档需要包含分词后的所有词
- 目标文档还要保持这些词的相对顺序和文档中的一致
说实话这个关键字我也不知道他的具体应用场景,如果有大佬经常用的可以评论一下(感谢指导)
我不是一个非常爱学习的孩子,一般不太会去主动的去学一些东西,只有用到了才会去学,但那是我有个习惯就是记笔记,碰到不会的感觉有用的我都会记录下来。希望跟大家一起学习进步,如果有错的请指正一下,本人也是刚刚入门的小白一个。嘻嘻