当前位置: 首页 > news >正文

Elasticsearch之bool查询

bool 查询是 Elasticsearch 中最常用的复合查询类型,允许将多个查询组合在一起。它通过逻辑操作符(如 mustshouldmust_notfilter)来构建复杂的查询条件,从而满足多条件匹配、逻辑与(AND)、或(OR)、非(NOT)的查询需求。

bool 查询主要由四个部分组成:

  • must:必须满足的条件(类似于 SQL 中的 AND)。
  • should:应该匹配的条件(类似于 SQL 中的 OR)。should 子句中的查询可以匹配也可以不匹配,但如果匹配,它会提高文档的相关性得分。
  • must_not:必须不匹配的条件(类似于 SQL 中的 NOT)。
  • filter:过滤条件,不影响文档的得分,只做精确的过滤判断。它对性能的影响较小,适合对大批量数据进行过滤。

1. 示例

GET /items/_search
{"query": {"bool": {"must": [{"match": {"name": "手机"}}],"should": [{"term": {"brand": { "value": "vivo" }}},{"term": {"brand": { "value": "小米" }}}],"must_not": [{"range": {"price": {"gte": 2500}}}],"filter": [{"range": {"price": {"lte": 1000}}}]}}
}

2. 解释

must(必须匹配)

  • 这里使用了一个 match 查询,要求文档中的 name 字段必须包含 "手机"。也就是说,只有 name 包含“手机”的文档才会被返回。

should(可选匹配)

  • 这里有两个 term 查询,分别要求 brand 字段为 "vivo""小米"。如果文档满足其中之一,将增加其相关性得分,但即使不匹配这些条件,文档也可能被返回(前提是 must 部分满足)。

must_not(必须不匹配)

  • 这里的 range 查询指定 price 字段的值必须小于 2500。也就是说,价格大于或等于 2500 的文档将被排除在外。

filter(过滤)

  • 使用 range 查询来筛选 price 小于或等于 1000 的文档。不同于 mustshouldfilter 不会影响文档的得分,只是对结果集进行精确的过滤,性能较好。

3. 使用

在idea中可以通过SearchRequest来构造查询条件。

// 构造查询条件
SearchRequest.Builder builder = new SearchRequest.Builder();builder.query(query -> query.bool(bool -> {// 必须匹配name为"手机"bool.must(must ->must.match(match ->match.field("name").query("手机")));// 添加 should 条件,匹配品牌(比如vivo或小米)bool.should(should -> should.term(term ->term.field("brand").value("vivo")));bool.should(should ->should.term(term ->term.field("brand").value("小米")));// 排除价格大于或等于2500的记录bool.mustNot(mustNot -> mustNot.range(range ->range.field("price").gte(2500)));// 过滤价格小于或等于1000的记录bool.filter(filter ->filter.range(range ->range.field("price").lte(1000)));return bool;
}));
http://www.lryc.cn/news/439885.html

相关文章:

  • IntelliJ IDEA 创建 Java 项目指南
  • 一起学Java(13)-[日志篇]教你分析SLF4J和Log4j2源码,掌握SLF4J与Log4j2桥接集成原理
  • 深入Redis:核心的缓存
  • 集群聊天服务器项目【C++】项目介绍和环境搭建
  • c++ #include <memory> 智能指针介绍
  • 32.递归、搜索、回溯之floodfill算法
  • Vue3.5+ 响应式 Props 解构
  • k8s中的认证授权
  • Leetcode 3291. Minimum Number of Valid Strings to Form Target I
  • PostgreSQL的查看主从同步状态
  • Java多态性的理解
  • 安全工具 | 使用Burp Suite的10个小tips
  • 企业项目中字符串工具类
  • 下载github patch到本地
  • C++基础部分代码
  • neo4j(spring) 使用示例
  • 链接升级:Element UI <el-link> 的应用
  • 简单题26 - 删除有序数组中的重复项(Java)20240917
  • DFS:深搜+回溯+剪枝实战解决OJ问题
  • 命令语境中的“可以”的字词含义分析
  • 直播相关03-录制麦克风声音, ffmpeg 命名,使用命令行完成录音
  • VUE3中ref与reactive
  • 高职院校人工智能技术和无人机技术实训室建设方案
  • x-cmd pkg | shtris: 在终端体验经典的俄罗斯方块游戏
  • Linux基础---07文件传输及解决yum安装失效的方法
  • [项目][WebServer][Makefile Shell]详细讲解
  • ElementUI大坑Notification修改样式
  • vivado中的diagram
  • 项目实现:云备份②(文件操作、Json等工具类的实现)
  • ‌内网穿透技术‌总结