大数据利器Elasticsearch之bool查询和boosting查询

341 阅读2分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

本Elasticsearch相关文章的版本为:7.4.2

bool查询

Elasticsearch的bool查询是使用一个或多个bool查询子句构建的,每个子句都是以下特定bool类型:

bool类型描述是否参与评分
mustmust里面的所有子句都满足的文档才返回
should应该满足should里面的0个或多个子句的文档才返回
must_notmust_not里面的子句不能出现在文档里
filter必须满足filter子句的文档才返回

bool查询遵循more-matches-is-better的原则。意味着满足must和should子句查询的分数将会汇总到一起作为最后的_scorre评分。filter和must_not的子句不纳入到评分范围,仅进行过滤文档 下面的查询语句就是查找获取满足以下条件的候选人:

  1. tag里面必须是有algorithm的;
  2. tag里面必须是有it行业经验的;
  3. 年龄不能大于36或者小于18岁;
  4. 至少熟悉以下编程语言中一种, 熟悉的语言越多越好:Python、Golang、C++或Java
POST /candidate/_search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "tag" : "algorithm" }
      },
      "filter": {
        "term" : { "tag" : "it" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 36, "lte" : 18 }
        }
      },
      "should" : [
        { "term" : { "tag" : "python" } },
        { "term" : { "tag" : "golang" } },
        { "term" : { "tag" : "c++" } },
        { "term" : { "tag" : "java" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

boosting查询

boosting查询返回满足positive子句的文档,并且同时降低满足negative子句的文档的相关性得分。这样,我们可以使用boosting查询将某些文档相关性降低而不将它们从搜索结果中排除。
下面的查询语句将会得到以下文档:

  1. 返回所有爱好里面喜欢苹果的文档;
  2. 降低喜欢苹果的同时喜欢薯片的文档的相关性得分。
GET /bank/_search
{
    "query": {
        "boosting" : {
            "positive" : {
                "term" : {
                    "hobby" : "apple"
                }
            },
            "negative" : {
                 "term" : {
                     "hobby" : "chips"
                }
            },
            "negative_boost" : 0.5
        }
    }
}

boosting查询适合挑选最重要的但允许存在某些不太重要的条件的文档。