ElastaticSearch-----es的DSL查询与过滤

news/2025/3/14 17:55:42/

DSL查询:

DSL全称Domain Specific language,即特定领域专用语言。

DSL,把查询条件写在JSON里面,然后进行相关的查询。

DSL主要分为查询DSL(query DSL)和过滤DSL(filter DSL)。

query DSL:

query match : 分词后才进行匹配。

GET 索引名称/_search
{"query" : { "match" : { "字段": "匹配内容" }}
}
  • multi_match 查询:

multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个:

{"multi_match": {"query":    "查询内容","fields":   [ "字段名称", "字段名称" ]}
}
filter DSL:

在过滤器Filter中,查询会回答这个问题——“这个文档匹不匹配?”

答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。

过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter

另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

  • term 过滤 :

term主要用于精确匹配哪些值.格式如下:

{"query": {"term": {"字段名称": "匹配内容"}}
}
  • terms 过滤:

terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配。
terms ,类似于mysql中的in关键字。

格式如下:

{"query": {"terms": {"字段名称": ["匹配内容","匹配内容"]}}
}
  • range 过滤:

range过滤允许我们按照指定范围查找一批数据:

{"range": {"age": {"gte":  20,"lt":   30}}
}

范围操作符包含:

    gt : 大于。greater than gte: 大于等于。greater than or equallt : 小于。 less thanlte: 小于等于。 less than or equal from 和to : from类似于gte,to类似于lte

格式如下:

{"query": {"range": {"字段名称": {"gt": 3}}} 
  • filter过滤:
{"query": {"bool": {"filter": {"range": {"字段名称": {"gte": 10,"lt": 27}}}}}
}
  • bool 查询/过滤:如果要执行多个关键词的and、or搜索,必须使用布尔查询过滤。

bool 查询/过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:

    must : 多个查询条件的完全匹配,相当于 and。must_not : 多个查询条件的相反匹配,相当于 not。should : 至少有一个查询条件匹配, 相当于 or。 

bool查询,如下所示:

  "query": { "bool": { "must": [{ "match": { "字段名称": "匹配内容" }}, { "match": { "字段名称": "匹配内容" }}  ]}}		

bool过滤,如下所示:

{"bool": {"must":     { "term": { "字段名称": "匹配内容" }},"must_not": { "term": { "字段名称": "匹配内容" }},"should": [{ "term": { "字段名称": "匹配内容" }},{ "term": { "字段名称": "匹配内容" }}]}
}
  • exist:字段是否存在。类似于 mysql中的 IS NOT NULL
{"query": {"bool": {"must": [{ "exists" : {"field" : "color" } }]}} 
}
  • missing : 跟exist相反。类似于mysql中的 IS NULL

其他查询

  • es 查询索引别名:
GET /索引名称/_alias/* 
  • es 添加/更新别名:
PUT /索引名称/_alias/别名名称
filter DSL和query DSL的区别:

而filter是精确匹配(exact-values)。而query是全文检索(full-text)。

filter只返回是否匹配,而query会返回相关度的分数score,并进行排序。

filter会进行缓存,query不会。

filter更快一些。query相对较慢。

如果你的查询是范围和类型比较广的,用filter; 如果是要求比较精准的,就用query来查询。

  • 同时使用query DSL和filter DSL,如下所示:
"query": {"filtered": {"query":  { "match": { "字段名": "匹配内容" }},"filter": { "term": { "字段名": "匹配内容" }}}}

参考资料:

http://blog.itpub.net/29715045/viewspace-2653369/

https://blog.csdn.net/qq_29580525/article/details/80908523

https://www.cnblogs.com/ghj1976/p/5293250.html


http://www.ppmy.cn/news/1213214.html

相关文章

交通信号标志识别系统 python 深度学习 YOLOv5

[毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 。 1、项目介绍 本系统基于YOLOv5,采用登录注册进行用…

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

RT-DETR 添加注意力机制 ! 本来想多发一些自己的个人魔改,但是有些同学还是需要一些基础的注意力改进,那么大家可以先用这篇文章的代码,我同样给大家提供了很多的模板。 文章目录 RT-DETR 添加注意力机制 !注意力机制介绍注意力机制的分类1. SE 注意力模块1.1 原理1.2 代码…

爬虫项目(13):使用lxml抓取相亲信息

文章目录 书籍推荐完整代码效果书籍推荐 如果你对Python网络爬虫感兴趣,强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧,是每位爬虫开发者的必读之作。详细介绍见👉: 《Python网络爬虫入门到实战》 书籍介绍 完整代码…

linux 内存查看方法:meminfo\maps\smaps\status 文件解析

linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍/proc系统下内存相关的几个文件 单个进程…

Android 升级软件后清空工厂模式测试进度

Android 升级软件后清空工厂模式测试进度 最近收到项目需求反馈:升级软件后,进入工厂模式测试项,界面显示测试项保留了升级前的测试状态(有成功及失败),需修改升级软件后默认清空测试项测试状态,具体修改参照如下: /…

什么是 CASB,在网络安全中的作用

数字化转型正在稳步攀升,组织现在越来越关注在线生产力系统和协作平台,各行各业的企业都采用了不同的云基础设施服务模式。云基础架构提供按需服务,可提高易用性、访问控制、内容协作和减少内部存储资源,以及许多其他好处。迁移到…

DevChat全能型AI编程助手,助你“以一敌三卷翻好友”

DevChat全能型AI编程助手,助你“以一敌三卷翻好友” 什么是DevChat,它能帮助我们做什么? DevChat是OpenAI的一个产品,它是一个可以进行编程相关对话的AI。这意味着你可以使用它来解决一些编程上的问题或者获取关于编程的建议。 …

Docker 问题记录

Docker问题记录 问题一:启动不了Docker 问题: [rootiZ2zeg7mctvft5renx1qvbZ docker]# systemctl start docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and &quo…