这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
本Elasticsearch相关文章的版本为:7.4.2
bool查询
Elasticsearch的bool查询是使用一个或多个bool查询子句构建的,每个子句都是以下特定bool类型:
bool类型 | 描述 | 是否参与评分 |
---|---|---|
must | must里面的所有子句都满足的文档才返回 | 是 |
should | 应该满足should里面的0个或多个子句的文档才返回 | 是 |
must_not | must_not里面的子句不能出现在文档里 | 否 |
filter | 必须满足filter子句的文档才返回 | 否 |
bool查询遵循more-matches-is-better的原则。意味着满足must和should子句查询的分数将会汇总到一起作为最后的_scorre评分。filter和must_not的子句不纳入到评分范围,仅进行过滤文档 下面的查询语句就是查找获取满足以下条件的候选人:
- tag里面必须是有
algorithm
的; - tag里面必须是有
it
行业经验的; - 年龄不能大于36或者小于18岁;
- 至少熟悉以下编程语言中一种, 熟悉的语言越多越好: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
查询将某些文档相关性降低而不将它们从搜索结果中排除。
下面的查询语句将会得到以下文档:
- 返回所有爱好里面喜欢苹果的文档;
- 降低喜欢苹果的同时喜欢薯片的文档的相关性得分。
GET /bank/_search
{
"query": {
"boosting" : {
"positive" : {
"term" : {
"hobby" : "apple"
}
},
"negative" : {
"term" : {
"hobby" : "chips"
}
},
"negative_boost" : 0.5
}
}
}
boosting查询适合挑选最重要的但允许存在某些不太重要的条件的文档。