本人刚刚毕业参加工作不久,因为工作的需要学习了一下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还是分词后去搜的
- 目标文档需要包含分词后的所有词
- 目标文档还要保持这些词的相对顺序和文档中的一致
说实话这个关键字我也不知道他的具体应用场景,如果有大佬经常用的可以评论一下(感谢指导)
这里我总结一下查询条件,想查询得到数据 GET /表名/_search
第一步写 query 后面跟你想要的查询条件