本文只写了对数据的操作的DML语句,如果需要DDL请评论告诉我

本人刚刚毕业参加工作不久,因为工作的需要学习了一下ES,因为做后端的都会使用数据库,都会写sql语句,所以在此整理了一下ES和MySQL语法的对比,记录一下自己的学习笔记,如果帮到你了,请评论支持一下,感谢

ES语法基本操作,满满的干货,没有废话。不像别的博主说一些原理性的东西,因为我也不太懂,用就完了,大家来搜语法也只是想知道怎么用,没人想去知道原理性的东西

假设现在有一张wk_single_customer表,下面所有的语法都是对这张表进行操作

1. 删除操作delete(删除id为21的数据)

delete from wk_single_customer where id=21
POST wk_single_customer/_delete_by_query   
{
  "query":{
    "term":{
      "id":21
    }
  }
}

2. 修改操作update(将id=4104的referrerId修改为15204,referrername修改为李四)

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"
                    }
                }
            ]
        }
    }
}

3. 查询所有

select * from wk_single_customer
GET /wk_single_customer/_search

上面是ES的一个简单的写法,也可以使用下面这种,下面这种多多少少有点多余了奥

GET /wk_single_customer/_search
{
  "query": {
    "match_all": {}
  }
}

4. 等值查询(查询name=张三的数据)

select * from wk_single_customer where name = '张三'
GET /wk_single_customer/_search
{
  "query": {
    "term": {
      "name": "张三"
    }
  }
}

5. 范围查询(查询age>=15的数据)

select  * from wk_single_customer where age >= 15

关键字:gt/lt:大于/小于 gte/lte:大于等于/小于等于

 GET /wk_single_customer/_search
{
  "query": {
    "range": {
      "age": {
        "gte":15
      }
    }
  }
}

6. bool 多条件复合查询(查询age>15并且name!=‘张三’)

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": "张三"
                    }
                }
            ]
        }
    }
}

7. 排序(按age降序排列)

select * from wk_single_customer order by age desc

升序asc,我不说你也懂

GET /wk_single_customer/_search
{
 "sort": [
   {
     "age": {
       "order": "desc"
     }
   }
 ]
}

8. MySQL中的in查询,在这个里面既满足查询条件(查询年龄为10、14、16岁的数据)

select * from wk_single_customer where age in(10, 14, 16)

记住term是等值,只有一个值。而terms是多值满足其中一个即可

GET /wk_single_customer/_search
{
    "query": {
        "terms": {
            "age": ["10","14","16"]
        }
    }
}

9. ids 只用于查询id可以查多条也可以查一个(查询id=2和id=3的数据)

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]
      }
  }
}

10. regexp根据正则表达式去匹配的,这个用的少没有细搞,只给一个简单的例子

姓名已”明明“结尾的

GET /wk_single_customer/_search/
{
  "query": {
      "regexp":{
       "name":".*明明"
      }
    
  }
}

11. 模糊匹配,相当于MySQL中的like(查询姓名中带有’朋‘的)

select * from wk_single_customer where name like %%

关键字wildcard,小伙伴这个非常的实用哦

GET /wk_single_customer/_search
{
    "query": {
        "wildcard": {
            "detail": {
                "name": "*朋*",
            }
        }
    }
}

12. 接下来的这个是一些函数式操作(求和、平均值、最大值、最小值)

直接上干货,这里只列举了求和,其他都一样只是换个关键字(sum avg max min )

 GET /wk_single_customer/_search
{
   #查询条件,对哪些进行求和,这里条件就简单了,大家可以根据自己的需要加查询条件
   "query":{
     "terms": {
       "age": [12,13,14]
     }
   },
   #固定语法 aggs
    "aggs" : {
        #随便起一个名字,相当于接收用
        "ageSum" : { 
          "sum": { 
          #对哪个字段求和
            "field" : "age" 
          } 
        }
    }
}

13. 只查询想要的字段(查询age=13的只要name和age两个字段)

查询ES时你会发现,因为查询结果是以JSON串展示的可能会很长很长,大部分都不是我们想看的,那么这个关键字就很重要了 _source

GET /wk_single_customer/_search
{
"_source": ["name","age"], 
  "query": {
    "term": {
      "age": "13"
    }
  }
}

14. ES中特有的分词查询

ES特有的分词查询,非常的强大,ES是倒排索引所以这个特有的功能非常的牛B,由于我们公司并不是做电商的,所以说这个分词查询并没有使用,个人理解也比较片面 关键字:match

如果你安装了ik分词器(也就是中文分词器)他会将中文就行拆分 拆分成北京天安门 凡是库里带有这两个词的任意一个的结果全部返回回来。当然如果你用的是ES自带的分词器,他会把中文一个字一个字的拆分,匹配任意一个字都返回。所以想用这个功能的话你要安装IK分词器哦(也就是中文分词器)

 GET /wk_single_customer/_search
{
  "query": {
    "match": {
      "address":"北京天安门"
    }
  }
}

15. ES中match_phrase也是分词和match的区别

  1. match_phrase还是分词后去搜的
  2. 目标文档需要包含分词后的所有词
  3. 目标文档还要保持这些词的相对顺序和文档中的一致

说实话这个关键字我也不知道他的具体应用场景,如果有大佬经常用的可以评论一下(感谢指导)

总结:

这里我总结一下查询条件,想查询得到数据 GET /表名/_search
第一步写 query 后面跟你想要的查询条件

  1. match分词匹配满足一个即返回
  2. term 精准搜索
  3. range 范围查询 gt/lt:大于/小于 gte/lte:大于等于/小于等于
  4. bool多条件复合查询
  5. sort 排序
  6. terms 相当于 mysql中的in
  7. wildcard 模糊匹配 mysql中的like
  8. sum avg max min 函数操作
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐