【Elasticsearch】 11-DSL语法详解-复合查询boosting query、constant_score、 dis_max、 function_score

文章目录

    • 1. Boosting Query
    • 2. Constant Score Query
    • 3. Dis Max Query
    • 4. Function Score Query
    • 5. 结论

在本文中我们将深入研究四种特殊的查询类型:Boosting Query、Constant Score Query、Dis Max Query和Function Score Query的特性、参数说明以及使用示例。

1. Boosting Query

Boosting Query允许在查询中为不同的子句设置不同的权重,以影响文档的相关性得分。不同于bool查询的是bool查询中只要一个子查询条件不匹配那么搜索的数据就不会出现。而Boosting Query则是降低显示的权重/优先级(即score)。这对于优化搜索结果的排序非常有用。Boosting Query有以下重要参数:

  • positive:正向查询子句(希望匹配的条件),用于增加相关性得分。

  • negative:负向查询子句(不希望匹配的条件),用于减少相关性得分。

  • negative_boost:0到1.0之间的浮点数,用于降低与negative查询匹配的文档的相关性得分,指定负向查询的权重值越大,负向查询的影响越小。

    • 得分计算规则:
      • 如果文档不满足nagative,那么返回原始得分
      • 如果文档满足了nagative,那么将原始匹配得分乘以

示例

{
  "query": {
    "boosting": {
      "positive": { "match": { "title": "Elasticsearch" } },
      "negative": { "term": { "status": "deprecated" } },
      "negative_boost": 0.5
    }
  }
}

在上面的示例中,正向查询子句匹配标题包含"Elasticsearch"的文档,而负向查询子句匹配status字段为"deprecated"的文档,但由于negative_boost设置为0.5,负向查询的影响被减小了一半。

2. Constant Score Query

Constant Score Query会为匹配的文档分配一个恒定的相关性得分,不考虑文档的内容或其他因素。这种查询适用于只关心文档是否匹配的情况,而不关心匹配程度。Constant Score Query的参数包括:

  • filter:用于指定过滤条件。

示例

{
  "query": {
    "constant_score": {
      "filter": {
        "term": { "category": "技术" }
      }
    }
  }
}

在上面的示例中,我们使用Constant Score Query过滤了category字段为"技术"的文档,并为它们分配了一个恒定的相关性得分。

补充:constant_score和filter区别
constant_score和filter相似,但是有不同的作用

  • constant_score:为匹配的文档分配一个固定的得分。它不关心文档与查询的实际匹配程度
    • 通常是在多个查询或过滤器中组合时,确保特定条件的文档获得相同的得分
  • filter:过滤器用于精确地过滤文档,不影响文档的得分
    • 通常是需要在结果中精确地排除或包含文档,或者只关心文档是否与查询条件匹配,而不关心匹配的程度时使用

3. Dis Max Query

Dis Max Query允许你在多个查询子句之间进行"OR"操作,并返回匹配任何一个子句的文档。这对于组合多个查询条件以获得更广泛的结果非常有用。Dis Max Query的参数包括:

  • queries 是一个包含多个查询的数组,每个查询都是单独的。第一个为主查询
  • tie_breaker:指定子句之间的权重比例。是一个介于 0 到 1 之间的浮点数,它决定了非主要查询的得分对主要查询得分的影响。默认为 0.0,表示非主要查询不影响主要查询的得分。如果设置为 1.0,那么非主要查询的得分将完全影响主要查询的得分。
  • boost 是一个浮点数,用于调整整个 dis_max 查询的得分。默认为 1.0。

示例

{
  "query": {
    "dis_max": {
      "queries": [
        { "match": { "title": "Elasticsearch" } },
        { "match": { "content": "Kibana" } }
      ],
      "tie_breaker": 0.3,
      "boost": 1.2
    }
  }
}

在上面的示例中,我们使用Dis Max Query执行一个标题包含"Elasticsearch"或内容包含"Kibana"的查询,其中tie_breaker参数设置为0.3,表示子句之间的权重比例。

补充:
dis_max将与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回。每个查询都会产生一个单独的分数,这些得分会根据 tie_breaker 和 boost 进行组合,得到一个最终的综合得分。

  • 计算公式 = (得分1 * boost) + (得分2 * boost) * (1 - tie_breaker)

4. Function Score Query

正常情况只有参与匹配的字段才会参与计算得分,但Elasticsearch提供了方法function_score,通过函数来对相关性评分进行二次计算

Function Score Query允许使用自定义函数来调整文档的相关性得分,这些函数可以基于文档的字段值、距离等信息来计算得分。这种查询非常适用于需要精细调整查询结果的情况。

function_score 提供了多种类型的评分函数

  • script_score script脚本评分
  • weight 字段权重评分
  • random_score 随机评分
  • field_value_factor 字段值因子评分
  • decay functions: gauss, linear, exp 衰减函数

function_score 还提供其他辅助的参数

先执行score_mode,再执行boost_mode

  • score_mode:决定function中多种评分函数如何计算合并
    • multiply 相乘—默认
    • sum 相加
    • avg 平均分
    • first 使用具有匹配过滤器的第一个函数的得分
    • max 取最大
    • min 取最小
  • max_boost:默认FLT_MAX(float 类型的最大值),限制function中多个评分函数通过score_mode计算后最大值,如果超过max_boost限制,会将限制值作为得分分数
  • min_score:默认0,限制function中多个评分函数通过score_mode计算后最小值,如果小于min_score限制,会将文档过滤掉
  • boost_mode:决定最后结果老分数和新分数如何计算合并
    • multiply:相乘—默认
    • sum:相加
    • min:取最小
    • max:取最大
    • replace:直接替换为新分数

示例1

{
  "query": {
    "function_score": {
      "query": { "match": { "title": "Elasticsearch" } },
      "functions": [
        {
          "filter": { "term": { "category": "技术" } },
          "weight": 2
        },
        {
          "gauss": {
            "date": {
              "origin": "now",
              "scale": "30d"
            }
          },
          "weight": 3
        }
      ],
      "score_mode": "sum"
    }
  }
}

在上面的示例中,我们使用Function Score Query来执行一个标题包含"Elasticsearch"的查询,同时应用了两个自定义函数来调整得分,其中一个基于category字段,另一个基于date字段。

示例2

"query": {
    "function_score": {
      "query": {
        "match": {
           "category": "技术"
        }
      },
      "functions": [
        {
          "weight": 1.5,
          "filter": {
            "term": {
              "title":"Elasticsearch"
            }
          }
        },
        {
          "weight": 3,
          "filter": {
            "term": {
              "content": "Kibana"
            }
          }
        }
      ],
      "min_score": 1,
      "max_boost": 10,
      "score_mode": "multiply",
      "boost_mode": "sum"
    }
  }

在上面的示例中,我们使用Function Score Query来执行一个分类包含"技术"的查询,同时应用了两个自定义函数来调整得分,其中一个基于title字段,另一个基于content字段。最后通过min_scoremax_boostscore_modeboost_mode控制得分计算。

  1. 查询category包含"技术"
  2. 如果title字段为"Elasticsearch",分数乘以1.5
  3. 如果content字段为"Kibana",分数乘以3
  4. function多个评分条件multiply,计算评分
  5. 去掉function评分小于1的文档,function评分大于10则按照10返回评分
  6. 最终得分使用sum:原文档分数 + function分数

5. 结论

本文详细介绍了Elasticsearch中的Boosting Query、Constant Score Query、Dis Max Query和Function Score Query,包括它们的特性、参数说明以及使用示例。通过灵活使用这些查询类型,可以更精确地控制搜索结果,满足不同的搜索需求。希望本文对你有所帮助!有任何问题或需要进一步的帮助,请随时在评论中提出。

你可能感兴趣的:(ES,elasticsearch,boosting,jenkins)