快速从SQL语法过度到Elasticsearch的DSL语法
前言
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]}
}
]
}
}
}
between-相当于range
例如
SELECT * FROM goods WHERE id between 1000 and 10005
相当于
{
"query": {
"bool": {
"must": [{
"range": {
"id": {
"gte": 1000,
"lte": 10005
}
}
}]
}
}
}
is null-相当于exist
例如
SELECT * FROM goods WHERE id is not null
相当于
{
"query": {
"bool": {
"must_not": [{
"exists": {
"field": "id"
}
}]
}
}
}
match-类似match...AGAINST
这个match就相当于mysql的全文索引,关于mysql的全文索引,可以看一下这篇文章:从零开始学习MySQL全文索引
举个查询的例子,我要搜索包含 "海南 2018"的词,如下
{
"query": {
"match": {
"name": "海南 2018"
}
}
}
这相当于把所有的“海南”和“2018”记录找出来了,他们是一个or的关系。如果想同时匹配怎么办呢?
可以这样,指定一个operator,默认是用的"or",可以改成这样
{
"query": {
"match": {
"name": {
"query": "海南 2018",
"operator": "and"
}
}
}
}
select-相当于includes
比如
SELECT id,name FROM goods WHERE id = 1765
相当于
{
"query": {
"bool": {
"must": [
{
"term": {
"id": 1765
}
}
]
}
},
"_source":{"includes":["id","name"]}
}
到这里,差不多就已经可以丝滑地从sql过度到es的dsl了
一些常见问题
match和term的区别
match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match
query和filter
filter:只查询出搜索条件的数据,不计算相关度分数
query:查询出搜索条件的数据,并计算相关度分数,按照分数进行倒序排序
filter比query性能好,两者可以一起使用
filtered和filter区别
filtered是比较老的的版本的语法。现在目前已经被bool替代。推荐使用bool。
老版本写法
{
"query": {
"filtered": {
"query": {
"match": {
"text": "quick brown fox"
}
},
"filter": {
"term": {
"status": "published"
}
}
}
}
}
新版本写法
{
"query": {
"bool": {
"must": {
"match": {
"text": "quick brown fox"
}
},
"filter": {
"term": {
"status": "published"
}
}
}
}
}
filter两种用法
嵌套在bool下
{
"query": {
"bool": {
"must": {
"term": {
"term": {
"title": "kitchen3"
}
}
},
"filter": {
"term": {
"price": 1000
}
}
}
}
}
在根目录下使用
{
"query": {
"term": {
"title": "kitchen3"
}
},
"filter": {
"term": {
"price": 1000
}
}
}
term和terms的区别
term相当于where =
terms相当于 where in (xx,xx,xx)
如果想要=于多次,得用多个term,而不是terms
还有一些内容,没来得及写,如order by、group by等等会陆续在这篇文章更新...
快速从SQL语法过度到Elasticsearch的DSL语法的更多相关文章
- 使用SQL语法来查询Elasticsearch:Elasticsearch-SQL插件
简介 Elasticsearch-SQL是Elasticsearch的一个插件,它可以让我们通过类似SQL的方式对Elasticsearch中的数据进行查询.项目地址是:https://github. ...
- 利用excel办公软件快速拼凑sql语句
日常工作中经常会收到excel整理好的部门或者人员等数据信息并需要批量更新或者插入到数据库中,常用的办法有导入.脚本拼凑执行等,今天我介绍直接使用excel快速拼凑sql语句的方法 1.update批 ...
- 快速查看SQL Server 中各表的数据量以及占用空间大小
快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...
- Elasticsearch Kibana查询语法
Elasticsearch Kibana查询语法 2018年06月03日 23:52:30 wangpei1949 阅读数:3992 Elasticsearch Kibana Discover的搜 ...
- 如何快速搜索SQL数据库数据和对象
原文 如何快速搜索SQL数据库数据和对象 Frequently, developers and DBAs need to search databases for objects or data. I ...
- 一次快速改写 SQL Server 高效查询的范例
原文:一次快速改写 SQL Server 高效查询的范例 最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後. 發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提 ...
- 使用excel中的数据快速生成sql语句
在小公司的话,总是会有要开发去导入历史数据(数据从旧系统迁移到新系统上)的时候.这个时候,现场实施或客户会给你一份EXCEL文档,里面包含了一些别的系统上的历史数据,然后就让你导入到现在的系统上面去. ...
- Flink SQL结合Kafka、Elasticsearch、Kibana实时分析电商用户行为
body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...
- ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解
前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...
随机推荐
- 架构之:serverless架构
目录 简介 什么是serverless serverless的例子 简单的三层服务 消息驱动 FaaS FaaS的缺点 FaaS的优点 总结 简介 不知道什么时候,出现了一个叫做Serverless架 ...
- Hadoop:什么是Hadoop??
官方讲解: Apache Hadoop 为可靠的,可扩展的分布式计算开发开源软件.Apache Hadoop软件库是一个框架,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集(海量的数据). ...
- Quartz:Quartz添加事务回滚报错
自动任务类: @PersistJobDataAfterExecution @DisallowConcurrentExecution public class ReCodeBack implements ...
- 使用Gradle构建多模块SpringBoot项目
使用Gradle构建多模块SpringBoot项目 本项目使用Gradle构建SpringBoot项目,将不同的业务进行不同的模块划分(不做微服务与分布式架构); - 编辑器:Intellij IDE ...
- 在spring boot使用总结(九) 使用yaml语言来写配置文件
yaml是专门用来写配置文件的语言.使用yaml来写配置文件扩展性比较强而且十分方便.spring boot支持使用yaml语言来写配置文件,使用snakeyaml库来读取配置文件.spring bo ...
- 被swoole坑哭的PHP程序员 (转)
本文主要记录一下学习swoole的过程.填过的坑以及swoole究竟有多么强大! 首先说一下对swoole的理解:披着PHP外衣的C程序.很多PHPer朋友看到swoole提供的强大功能.外界对其的崇 ...
- 「CF643G」 Choosing Ads
「CF643G」 Choosing Ads 传送门 如果你知道摩尔投票法可以扩展事实上是个一眼题,又好写又好调. 首先摩尔投票法是用来求众数定义为超过所有数个数一半的数的一个算法. 大致算法流程: 将 ...
- Linux下如何使用Rsync备份服务器重要数据
Rsync介绍: Rsync英文全称Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像,远程备份的功能,这个功能类似 ...
- 团队开发day02
进行android的UI界面设计,设计圆角输入框和圆形按钮, 以及点击的水滴效果 遇到问题,新建的drawable布局没有达到预期的效果,圆形按钮的 背景想设置为图片,但是发现会遮盖住水滴效果,改用新 ...
- C语言中函数的返回值
规则 除局部变量的内存地址不能作为函数的返回值外,其他类型的局部变量都能作为函数的返回值. 我总结出下面这些规则: int.char等数据类型的局部变量可以作为函数返回值. 在函数中声明的指针可以作为 ...