前言

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语法的更多相关文章

  1. 使用SQL语法来查询Elasticsearch:Elasticsearch-SQL插件

    简介 Elasticsearch-SQL是Elasticsearch的一个插件,它可以让我们通过类似SQL的方式对Elasticsearch中的数据进行查询.项目地址是:https://github. ...

  2. 利用excel办公软件快速拼凑sql语句

    日常工作中经常会收到excel整理好的部门或者人员等数据信息并需要批量更新或者插入到数据库中,常用的办法有导入.脚本拼凑执行等,今天我介绍直接使用excel快速拼凑sql语句的方法 1.update批 ...

  3. 快速查看SQL Server 中各表的数据量以及占用空间大小

    快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...

  4. Elasticsearch Kibana查询语法

    Elasticsearch Kibana查询语法 2018年06月03日 23:52:30 wangpei1949 阅读数:3992   Elasticsearch Kibana Discover的搜 ...

  5. 如何快速搜索SQL数据库数据和对象

    原文 如何快速搜索SQL数据库数据和对象 Frequently, developers and DBAs need to search databases for objects or data. I ...

  6. 一次快速改写 SQL Server 高效查询的范例

    原文:一次快速改写 SQL Server 高效查询的范例 最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後. 發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提 ...

  7. 使用excel中的数据快速生成sql语句

    在小公司的话,总是会有要开发去导入历史数据(数据从旧系统迁移到新系统上)的时候.这个时候,现场实施或客户会给你一份EXCEL文档,里面包含了一些别的系统上的历史数据,然后就让你导入到现在的系统上面去. ...

  8. Flink SQL结合Kafka、Elasticsearch、Kibana实时分析电商用户行为

    body { margin: 0 auto; font: 13px / 1 Helvetica, Arial, sans-serif; color: rgba(68, 68, 68, 1); padd ...

  9. ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解

    前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...

随机推荐

  1. AvtiveMQ与SpringBoot结合

    首先来了解下ActivieMQ的应用场景,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构是大型分布式系统不可缺少的中间件 ...

  2. Docker环境RabbitMq配置SSL

    RabbitMQ要对外提供服务,考虑到安全性,配置SSL进行访问,ssl端口5671,内部仍然使用5672进行访问,两者同时兼容. 安装环境 CentOS 7.5 Docker 1.13.1 Git ...

  3. rabbitmq概念简介

    AMQP协议 AMQP: Advanced Message Queue,高级队列协议. 特征: 这是一个在进程间传递异步消息的网络协议,因此数据的发送方.接收方以及容器(MQ)都可以在不同的设备上. ...

  4. Python分析【公众号】历史评论,看看大家的留言情况!

    大家好,我是辰哥~~~ 辰哥玩公众号有一段时间了,这期文章分析一波读者的留言情况,不仅可以对公众号的各位铁粉一目了然,还可以通过分析的结果对公众号的经营进行更好的规划.如读者留言的内容通常是内容是什么 ...

  5. JavaScript中使用eval()方法解析json串

    最近在js用到了eval()方法,在这里做个笔记 当时是这么用的:data = eval("("+data+")"); data为后台向前台传送的一个json串 ...

  6. Codeforces Round #139 (Div. 2) 题解

    vp上古场次ing CF225A Dice Tower 1.题目简述: 有 \(n\) 个骰子被叠在了一起.对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) . 你是小明,你只能从正面看这个 ...

  7. Ajax爬取动态数据和HTTPS自动默认证书

    Ajax数据爬取 在spider爬取数据的过程中,有些网页的数据是利用Ajax动态加载出来的,所以,在网页源代码中可能不会看到这一部分的数据,因此,我们需要使用另外的方式进行数据多爬取. 以豆瓣电影的 ...

  8. 论文阅读:Robust Visual SLAM with Point and Line Features

    本文提出了使用异构点线特征的slam系统,继承了ORB-SLAM,包括双目匹配.帧追踪.局部地图.回环检测以及基于点线的BA.使用最少的参数对线特征采用标准正交表示,推导了线特征重投影误差的雅克比矩阵 ...

  9. Map集合笔记

    一.Map集合的特点 Map集合是一个双列集合 Map中的元素,key和value的数据类型可以相同,也可以不同. Map中的元素,key是允许重复的,value是可以重复的 Map中的元素,key和 ...

  10. Python+Requests+Bs4(解析)爬取某诗词信息(数据分析二)

    1.环境安装 - 需要将pip源设置为国内源,阿里源.豆瓣源.网易源等 - windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个 ...