ES 布尔查询中 minimum_should_match 参数使用避坑

简介: ES 布尔查询中 minimum_should_match 参数使用避坑

在 Elasticsearch (ES) 中,布尔查询(Boolean Query)是一种查询类型,它允许你组合多个查询子句以控制搜索结果的匹配逻辑。minimum_should_match 是布尔查询中一个重要的参数,用于指定至少应该匹配的子句数量。


minimum_should_match 的值可以是一个具体的数字,也可以是一个百分比。它的具体含义取决于查询中的 should 子句的数量。


当 minimum_should_match 是一个整数时,它表示至少需要匹配的 should 子句数量。例如,如果将 minimum_should_match 设置为2,而查询中有4个 should 子句,那么至少需要匹配其中的2个子句才能满足查询条件。


当 minimum_should_match 是一个百分比时,它表示基于 should 子句的总数的相对比例。百分比的计算是根据有效的子句数量进行的,有效的子句是指那些非空、非布尔条件的子句。例如,如果设置 minimum_should_match 为"50%",而查询中有6个 should 子句,其中只有3个子句是非空的,那么至少需要匹配其中的2个子句(50% 的3)才能满足查询条件。


minimum_should_match 还可以使用特殊的语法来更精确地控制匹配条件。例如,可以使用百分比和固定值的组合,如"3<90%",表示至少需要匹配3个子句或总数的90%(以较大者为准)。


使用 minimum_should_match 参数可以灵活地控制布尔查询的匹配要求,使得查询结果更加符合预期。根据你的需求,可以根据子句的数量、百分比或它们的组合来调整该参数,以达到最佳的查询结果。


1、第一语义

minimum_should_match 参数用来指定 should 返回的文档必须匹配的条件的数量或百分比,如果 bool 查询包含至少一个 should 子句,而没有 must 或 filter 子句,则默认值为 1。

# 条件1: name中包含 "phone"
# 当未设置 minimum_should_match 参数时,多个条件的关系为 OR
# 条件2: type 等于 "phone"
GET goods_en/_search
{
  "_source": false,
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "type.keyword": "phone"
          }
        },
        {
          "match": {
            "name": "phone"
          }
        }
      ],
      "minimum_should_match": 2 // 设置为 2 则此时需要至少满足 2 个条件
    }
  }
}

2、第二语义

但是如果 bool 查询中同级子句中出现了 must 或者 filter 子句,则 minimum_should_match 的默认值将变为 0。

# ( must 或者 filter )和 should 组合
# 条件1: 价格小于20000
# 条件2: name中包含"phone"或者 type 等于"phone"
GET goods_en/_search
{
  "_source": false,
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "price": {
              "lte": "20000"
            }
          }
        }
      ],
      "should": [
        {
          "term": {
            "type.keyword": "phone"
          }
        },
        {
          "match": {
            "name": "phone"
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}


相关文章
|
编解码 缓存 数据安全/隐私保护
浅析 HLS 流媒体协议
【2月更文挑战第13天】浅析 HLS 流媒体协议
1857 5
浅析 HLS 流媒体协议
|
存储 Java 索引
Elastic实战:彻底解决spring-data-elasticsearch日期、时间类型数据读取报错问题
在使用spring-data-elasticsearch读取es中时间类型的数据时出现了日期转换报错,不少初学者会在这里困惑很久,所以今天我们专门来解读该问题的几种解决方案。
2808 0
Elastic实战:彻底解决spring-data-elasticsearch日期、时间类型数据读取报错问题
|
8月前
|
人工智能 运维 监控
日志太多根本看不过来?教你用AI,让日志自己“说人话”!
日志太多根本看不过来?教你用AI,让日志自己“说人话”!
1669 0
|
12月前
|
数据采集 JSON 数据挖掘
Elasticsearch 的DSL查询,聚合查询与多维度数据统计
Elasticsearch的DSL查询与聚合查询提供了强大的数据检索和统计分析能力。通过合理构建DSL查询,用户可以高效地搜索数据,并使用聚合查询对数据进行多维度统计分析。在实际应用中,灵活运用这些工具不仅能提高查询效率,还能为数据分析提供深入洞察。理解并掌握这些技术,将显著提升在大数据场景中的分析和处理能力。
623 20
|
消息中间件 RocketMQ Apache
消息队列 MQ产品使用合集之如何修改proxy的端口
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
347 0
|
安全 Java 编译器
springboot 整合表达式计算引擎 Aviator 使用示例详解
本文详细介绍了Google Aviator 这款高性能、轻量级的 Java 表达式求值引擎
2125 6
|
存储 分布式计算 搜索推荐
ES自定义评分机制:function_score查询详解
ES自定义评分机制:function_score查询详解
2210 0
ES自定义评分机制:function_score查询详解
|
自然语言处理 索引
Elasticsearch 常用查询语句大全
【7月更文挑战第8天】Elasticsearch 常用查询语句大全

热门文章

最新文章