Elasticsearch Boolean Query查询介绍

前言

ES 和 Solr 的底层都是基于Apache Lucene 实现,bool 查询的底层实现是Lucene 的 BooleanQuery,其可以组合多个子句查询,类似 SQL 语句里面的 OR 查询。

查询介绍

在 ES 里面 Boolean 查询封装了 4 种 API 接口能力,可以单独使用,也可以组合使用,总结如下:

|----------|-----------------------------------------------------------------------------------|
| 函数 | 描述 |
| must | query 关键词在召回文档里面必须包含,参与相关性评分 |
| filter | query 关键词在召回文档里面必须包含,不参与相关性评分,但结果集会被缓存 |
| should | query 关键词在召回文档里面可能包含,如果只有一个 should 子句情况下与 must 子句结果一样,如果有多个should子句情况下,命中任何一个即可召回 |
| must_not | query 关键词在召回文档里面必须排除,不参与相关性评分,但结果集会被缓存 |

评分介绍

boolean 查询的评分原理是,匹配越多越好,在 must 和 should 子句里面的匹配成功后,最终会将相关性评分累加到 score 里面

查询示例

复制代码
POST _search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user.id" : "kimchy" }
      },
      "filter": {
        "term" : { "tags" : "production" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tags" : "env1" } },
        { "term" : { "tags" : "deployed" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

其他参数介绍

minimum_should_match

该参数控制 should 子句召回的文档,其匹配条件应该达到的数量或百分比,如果 bool 查询只有一个 should 子句且没有 must 和 filter 子句的前提下该参数的值为 1,其他情况下为 0

minimum_should_match参数的取值列表:

|------|---------------|-------------------------------------------------------------------------------------------------------------------------------------|
| 类型 | 例子 | 说明 |
| 正整数 | 3 | 固定 3 个,与子句数量无关 |
| 负整数 | -2 | 子句总数 - 2 |
| 百分比 | 75% | 子句总数 * 0.75 后向下取整 |
| 负百分比 | -25% | 子句总数 - (子句总数*0.25 后向下取整) |
| 组合 | 3<90% | 如果子句数量小于等于3,则全部都是必须的,但如果大于 3,则仅需要 90% 子句满足 |
| 多种组合 | 2<-25% 9<-3 | es 支持多种限定条件组合,中间使用空格分隔,每个条件的规范仅在大于前一个的数字有效,在这个例子种,如果子句数量有 1 个或者 2 个,那么两个都是必须的,如果有 3-9 个,则需要除 25%之外的所有子句,如果超过 9 个则需要除 3 个子句之外的所有子句匹配 |

filter

在 filter 中指定查询对相关性评分没有影响,分数返回都是 0,分数仅受指定查询的影响,例如以下的三个查询都会查询指定条件的文档:

filter query 评分为 0,因为没有指定评分查询
复制代码
GET _search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}
bool query 有一个 match_all 查询,所以所有文档的评分都为 1.0
复制代码
GET _search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}
constant_score 与 match_all 类似,分配同样的 1.0 分数
复制代码
GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}
named_queries

可以在每个顶级查询中传入一个 _name命名字段,用来跟踪那些查询与返回的文档匹配,如果使用了命名查询,那么返回的结果种则会包含每个命中的 matched_queries 属性

复制代码
GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "name.first": { "query": "shay", "_name": "first" } } },
        { "match": { "name.last": { "query": "banon", "_name": "last" } } }
      ],
      "filter": {
        "terms": {
          "name.last": [ "banon", "kimchy" ],
          "_name": "test"
        }
      }
    }
  }
}

此外在请求中还可以传入一个 include_named_queries_score 参数,可以控制是否返回与匹配查询关联的分数,这里需要注意 在 filter 中的查询,在 must_not上下文种的查询,以及出现在 constant_score 或 function_score_query内查询的分数,不会对文档总分数产生影响

复制代码
GET /_search?include_named_queries_score
{
  "query": {
    "bool": {
      "should": [
        { "match": { "name.first": { "query": "shay", "_name": "first" } } },
        { "match": { "name.last": { "query": "banon", "_name": "last" } } }
      ],
      "filter": {
        "terms": {
          "name.last": [ "banon", "kimchy" ],
          "_name": "test"
        }
      }
    }
  }
}

此外,命名查询会对查询性能造成一定影响,在 hits 命中量大的时候会更明显,应谨慎使用

相关推荐
IT大白鼠2 分钟前
搜索系列 · 第 07 篇——调优实战:写入、查询与监控
elasticsearch·nosql
AC赳赳老秦14 分钟前
OpenClaw 数据引用规范自动生成:为公开数据构建可信来源标注与标准引用体系
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
乐迪信息29 分钟前
AI防爆摄像机,监测港口船舶航行偏航隐患
大数据·人工智能·深度学习·算法·计算机视觉
西索斯coding1 小时前
grok-4.7 调用一直 429 怎么办?不是额度用完——是 RPM 和 TPM 双桶限流,附响应头读取代码和退避策略
大数据·人工智能·机器学习·ai
QYR-分析2 小时前
生物识别装备升级:全球全掌掌纹扫描仪市场格局与发展前景解析
大数据
蜗牛互联网2 小时前
从Barclays扩大Claude部署看受监管软件工程的责任重分配
java·大数据·人工智能·后端·软件工程
JieDavid3 小时前
奇智创达知识产权管理系统期限监控模块实操,告别人工期限疏漏,实现管理闭环!
大数据·运维·人工智能·经验分享·重构
lisw053 小时前
大数据和开放科学时代的信息计量学:信息科学与数据科学之间的桥梁
大数据·开放科学·信息计量学
starzy19903 小时前
Flink Akka底层原理深度剖析:从ActorSystem到Dispatcher调度器的底层实现
大数据·flink
段一凡-华北理工大学4 小时前
大模型与智能体在工业的应用~系列文章12:大模型 × 数字孪生 × 智能体的融合图景
大数据·人工智能·python·深度学习·大语言模型·python开发