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

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.kler.cn/a/307963.html

相关文章:

  • Redo与Undo的区别:数据库事务的恢复与撤销机制
  • 爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)
  • python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态
  • 缓存与数据库不一致的解决方案:深入理解与实践
  • #include<string>和#include<string.h>有什么区别
  • MySQL的SQL书写顺序和执行顺序
  • Vue页面中实现自动播放报警音
  • Python实现Socket.IO的完整指南
  • JavaSE - 易错题集 - 006
  • 学懂C++(六十):C++ 11、C++ 14、C++ 17、C++ 20新特性大总结(万字详解大全)
  • Idea 中的一些配置
  • PointNet++改进策略 :模块改进 | Residual MLP | PointMLP,简化原本复杂的局部几何特征提取器,减少计算同时提高效率
  • 记录近期iOS开发几个报错及解决方案
  • 在线查看 Android 系统源代码 AOSPXRef and AndroidXRef
  • Spring 的循环依赖
  • Git提交类型
  • 3D云渲染农场为何怎么贵?主要消耗成本介绍
  • Vue路由二(嵌套多级路由、路由query传参、路由命名、路由params传参、props配置、<router-link>的replace属性)
  • 【GIS开发小课堂】写一个高德地图巡航功能的小DEMO
  • 遗传算法及其MATLAB实现
  • Leetcode 字母异位词分组
  • Error: ENOENT: no such file or directory, uv_cwd
  • JVM-内存区域
  • 新装mysql8 并开启外网连接
  • 理解DataLoader
  • Redis——常用数据类型hash