教你快速从SQL过度到Elasticsearch的DSL查询

参考: https://blog.csdn.net/hellozhxy/article/details/131831897

前言

Elasticsearch太强大了,强大到跟python一样,一种查询能好几种语法。其实我们用到的可能只是其中的一部分,比如:全文搜索
我们一般是会将mysql的部分字段导入到es,再查询出相应的ID,再根据这些ID去数据库找出来。

问题来了:数据导入到es后,很多人都要面对这个es的json查询语法,也叫DSL,如下

 

于是一堆新词来了,比如:filter、match、multi_match、query、term、range,容易让没学过的人抵触

如果正常开发业务的程序员,只关心原先怎么用sql查询出来的数据,在es中查询出来。
sql查询定位,一般常用的是:=、!=、>、<、and、or、in、between等等。

举个例子,原先sql查询一商品是这样的

SELECT * FROM goods WHERE spu_id = "wp123" OR ( spu_id = "wp345" AND min_price = 30 ) 

对应到es是

复制代码
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "spu_id": "wp123"
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "spu_id": "wp345"
                }
              },
              {
                "term": {
                  "min_price": 30
                }
              }
            ]
          }
        }
      ]
    }
  }
}
复制代码

sql和dsl是有一定对应关系的,下面把一些常用的总结下,让不熟悉es的童鞋能丝滑能从sql过度

以下内容由chenqionghe倾情提供,祝您es使用愉快

bool-相当于一个括号

用bool包含起来的{},相当用()包含了一个复合查询语句,如上边的

复制代码
{
  "bool": {
    "must": [
      {
        "term": {
          "spu_id": "wp345"
        }
      },
      {
        "term": {
          "min_price": 30
        }
      }
    ]
  }
}
复制代码

相当于
 

 

看到没有就是这么简单

 

should-相当于or

 

must-相当于and:

 

must_not-相当于 ! and

这个就相当于and取反了,

例如:

SELECT  *  FROM goods WHERE !(shop_id =79)

相当于:

复制代码
{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "shop_id": "79"
          }
        }
      ]
    }
  }
}
复制代码

term-相当于=

例如: SELECT * FROM goods WHERE shop_id =79

相当于:

复制代码
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {"shop_id": "79"}
        }
      ]
    }
  }
}
复制代码

terms-相当于in

例如: SELECT * FROM goods WHERE shop_id in (79,80,81)

复制代码
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "shop_id": [79, 80, 81]
          }
        }
      ]
    }
  }
}
复制代码

range-相当于between

例如: SELECT * FROM goods WHERE id between 1000 and 10005

相当于:

复制代码
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "id": {
              "gte": 1000,
              "lte": 10005
            }
          }
        }
      ]
    }
  }
}
 
复制代码

exist相当于is not null

例如 : SELECT * FROM goods WHERE id is not null

复制代码
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "id"
          }
        }
      ]
    }
  }
}
复制代码

 

 

 

posted @   苹果芒  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2024-01-16 python获取当前执行py文件的路径
2024-01-16 os.environ和os.putenv的区别
2024-01-16 jenkins中配置linux/windows脚本: python文件传dict参数
点击右上角即可分享
微信分享提示