美文网首页
复合查询

复合查询

作者: caster | 来源:发表于2020-11-10 21:31 被阅读0次

对应72.官放文档路径:Query DSL » Compound queries
官方地址如下:
https://www.elastic.co/guide/en/elasticsearch/reference/7.2/compound-queries.html

复合查询

复合查询包含其他复合或者叶子查询,组合他们的查询结果或者分数,更改他们的行为,或者从query切换为filter上下文。复合查询分为以下查询:
Bool查询
组合must,should,must_not和filter四种子句为复合查询,must和should为query查询,must_not和filter为filter过滤上下文。
Boosting查询
返回与positive查询匹配的文档,但减少与negative查询匹配的文档的分数
Constant_score查询
一个查询,包装另一个查询,但在filter过滤器上下文中执行它。所有匹配的文档都被赋予相同的“常量”_score。
Dis_max查询
一个接受多个查询的查询,并返回与任何查询子句匹配的任何文档。当bool查询合并所有匹配查询的分数时,dis_max查询将使用单个最佳匹配查询子句的分数。
Function_score查询
使用函数修改主查询返回的分数,以考虑诸如受欢迎程度,新近度,距离或使用脚本实现的自定义算法等因素。

1. Boolean查询

2. Boosting查询

返回positive query匹配的文档并减小negative query匹配文档的分数。
您可以使用boosting查询来降级某些文档,而不必将它们从搜索结果中排除。

查询示例:

GET /_search
{
  "query": {
    "boosting": {
      "positive": {
        "term": {
          "text": "apple"
        }
      },
      "negative": {
        "term": {
          "text": "pie tart fruit crumble tree"
        }
      },
      "negative_boost": 0.5
    }
  }
}

boosting查询的顶级参数

positive:

(必需的,查询主体对象)要运行的query查询。返回的所有文档都必须与此查询匹配。

negative:

(必需的,查询主体对象)减少匹配到文档的相关性分数的query查询。
如果返回的文档与positive查询匹配,则该 boosting查询将如下计算该文档的最终相关性得分:
1.从positive查询中获取原始的相关性分数。
2.将分数乘以negative_boost值。

negative_boost:

(必需,浮点数)介于0至1.0之间的浮点数,用于降低与negative查询匹配的文档 的相关性得分。

3. Constant score查询

包含一个过滤查询,并返回每个匹配文档的相关性得分等于boost 参数值。(恒定分数查询,可以将term查询转为filter查询,不算分数并且缓存查询,提高性能。)

查询示例:

GET /_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "user": "kimchy"
        }
      },
      "boost": 1.2
    }
  }
}

constant_score查询的顶级参数:

filter

(必需的,查询主体对象)要运行的过滤查询。返回的所有文档都必须与此查询匹配。
过滤查询不计算相关性分数。为了提高性能,Elasticsearch自动缓存经常使用的过滤器查询。

boost

(可选,float)浮点数,用作与过滤查询匹配的每个文档的恒定相关性得分。默认为1.0。

4. Disjunction max查询

返回与一个或多个包含查询(查询子句/子句)匹配的文档(即单字符串多字段查询)。
如果返回文档匹配到多个查询子句,则dis_max查询会为该文档分配来自任何匹配子句的最高相关性得分,再加上任何其他匹配子查询的tie breaking increment。
(可以实现:将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回)。

请求示例:

GET /_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "term": {
            "title": "Quick pets"
          }
        },
        {
          "term": {
            "body": "Quick pets"
          }
        }
      ],
      "tie_breaker": 0.7
    }
  }
}

dis_max查询的顶级参数

queries

(必须的,查询对象数组)包含一个或多个查询子句,返回的文档必须匹配一个或者多个查询。如果文档匹配到多个查询,es使用分数最高的相关性得分。

tie_breaker

(必需的,浮点数)介于0至1.0之间的浮点数,用于增加文档匹配多查询子句的相关性得分,默认是0.0。

如果一个文档匹配到多个查询子句,dis_max查询以如下方式计算文档的相关性得分:

  1. 使用匹配到的查询子句中评分最高的作为相关性得分。
  2. 将其他匹配的查询子句评分与tie_breaker相乘
  3. 将最高的评分与乘得的评分相加

4. Function score 查询

function_score允许你修改查询返回的文档的分数。如果分数函数计算代价很大且足以在一组过滤后的文档上计算分数,此功能将很有作用。
使用function_score,用户需要定义一个查询和一个或多个函数,用来计算查询返回文档的新分数。

function_score只能以以下一种形式运行:

GET /_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "boost": "5",
      "random_score": {},
      "boost_mode": "multiply"
    }
  }
}

查看function score提供的函数列表
此外,可以组合几个functions。在这种情况下,可以选择仅在文档与给定的过滤查询匹配时才应用功能

GET /_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "boost": "5",//整个查询的boost
      "functions": [
        {
          "filter": {
            "match": {
              "test": "bar"
            }
          },
          "random_score": {},
          "weight": 23
        },
        {
          "filter": {
            "match": {
              "test": "cat"
            }
          },
          "weight": 42
        }
      ],
      "max_boost": 42,
      "score_mode": "max",
      "boost_mode": "multiply",
      "min_score": 42
    }
  }
}

每个函数的过滤查询所产生的分数无关紧要
如果没有给函数提供过滤器,则等同于指定 "match_all": {}
首先,每个文档由定义的函数们决定分数

score_mode参数具体说明每个函数计算的分数如何组合起来:

multiply(默认):分数相乘
sum:分数相加
avg:分数平均值
first:使用第一个filter匹配的函数
max:使用分数最高分
min:使用分数最低分

通过参数boost_mode设置新的计算分数如何与查询分数组合起来:

multiply(默认):分数相乘
replace:只使用函数计算分数,忽略查询分数
sum:分数相加
avg:分数平均值
max:使用分数最高分
min:使用分数最低分
可以通过设置min_score设置过滤分数低的文档。

function_score提供一下几种函数:

script_score:脚本定义函数,最自由
weight:得分乘以常数
random_score:指定随机分数/(随机但是顺序一致)
field_value_factor:数值字段值参与分数计算
decay functions:gauss,linear,exp:三种衰减函数

相关文章

网友评论

      本文标题:复合查询

      本文链接:https://www.haomeiwen.com/subject/hzqsbktx.html