Elasticsearch语法和MySQL对比使用教程
本人刚刚毕业参加工作不久,因为工作的需要学习了一下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的区别
- match_phrase还是分词后去搜的
- 目标文档需要包含分词后的所有词
- 目标文档还要保持这些词的相对顺序和文档中的一致
说实话这个关键字我也不知道他的具体应用场景,如果有大佬经常用的可以评论一下(感谢指导)
总结:
我不是一个非常爱学习的孩子,一般不太会去主动的去学一些东西,只有用到了才会去学,但那是我有个习惯就是记笔记,碰到不会的感觉有用的我都会记录下来。希望跟大家一起学习进步,如果有错的请指正一下,本人也是刚刚入门的小白一个。嘻嘻