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
    }
  }
}


相关文章
|
7月前
|
JavaScript
js开发:请解释什么是ES6的默认参数(default parameters),并给出一个示例。
ES6允许在函数参数中设置默认值,如`function greet(name = &#39;World&#39;) {...}`。当调用函数不传入`name`参数时,它将默认为&#39;World&#39;,提升代码简洁性和可读性。例如:`greet()`输出&quot;Hello, World!&quot;,`greet(&#39;Alice&#39;)`输出&quot;Hello, Alice!&quot;。
40 4
|
搜索推荐 索引
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
ES中 minimum_should_match 的用法和误区
ES中 minimum_should_match 的用法和误区
ES中 minimum_should_match 的用法和误区
ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
|
监控 Java 索引
增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案
增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案
增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案
|
SQL 缓存 Java
修改PostgreSQL字段长度导致cached plan must not change result type错误
修改PostgreSQL字段长度可能导致cached plan must not change result type错误
7487 0