美文网首页
复合查询

复合查询

作者: 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