ElasticSearch-复合查询

ElasticSearch-复合查询

丁起男 305 2021-12-17

ElasticSearch-复合查询

布尔查询 bool

可以将较小的查询组合成较大的查询

子句类型

类型描述
must必须匹配,贡献算分
filter过滤子句,必须不能匹配,但不贡献算分
should选择性匹配,至少满足一条,贡献算分
must_not过滤子句,必须匹配,但不贡献算分

案例

POST user/_search
{
    "query":{
        "bool":{
            "must":{ //must_not should filter
                "term":{"name":"zhangsan"}
            }
        }
    }
}

提高查询 boosting

不同于bool查询,bool查询种只要一个子查询条件不匹配那么搜索的数据就不会出现。而boosting则是降低显示的权重(score)

子句类型

参数描述
positive指定希望执行的查询子句,返回的结果都将满足该子句的条件
negative用于降低匹配文档的相似度分
negative_boost浮点数,介于0-1.0之间,用于降低匹配文档的相似分

此三个属性在boosting种需要同时出现

计算分数

若一个匹配返回的文档既满足positive又满足negative时

  1. 获取从positive查询中的原始分数
  2. 将获取的分数与negative_boost相乘得到最终分

案例

GET user/_search
{
  "query": {
    "boosting": {
      "positive": {
        "term": {
          "name": {
            "value": "zhangsan"
          }
        }
      },
      "negative": {
        "term": {
          "age": {
            "value": 20
          }
        }
      },
      "negative_boost": 0.1
    }
  }
}

固定分数查询 constant_score

查询某个条件时,固定的返回指定的score

显然不需要计算score时,只需要filter条件即可,因为filter忽略score

案例

GET user/_search
{
    "query":{
        "constant_score":{
            "filter":{
                "term":{"age":20}
            },
            "boost":1.2 //所有符合条件的结果评分都是1.2
        }
    }
}

最佳匹配查询 dis_max

分离最大化查询(disjunction max query)指的是:将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回

bool是会将每个符合条件的子查询的分数相加计算出,这个文档的最终得分

子查询

参数描述
queries包含一个或者多个查询子句。返回的文档必须匹配其中一个或者多个。如果文档匹配了多个,则返回最高得分
tie_breaker一个介于0-1.0之间的float数,用于当文档匹配了多个查询子句时提升相关分数。默认为0.0

案例

GET user/_search
{
    "query":{
        "dis_max":{
            "queries": [
                {"match":{"name":"zhangsan"}},
                {"match":{"age":20}}
            ],
            "tie_breaker":0
        }
    }
}