Elasticsearch复合查询
在Elasticsearch中,复合查询(Compound Queries)是用来封装其他复合查询或叶子查询的查询类型。它们的主要目的是组合这些查询的结果和分数、改变它们的行为或者从查询上下文切换到过滤上下文。
一个常见的复合查询是bool
查询,它允许你通过布尔逻辑组合多个查询条件。bool
查询包含以下几种子句:
must
: 文档必须匹配所有must
子句下的查询条件,并且这些匹配会影响到文档的相关性评分。should
: 文档可以匹配should
子句下的一个或多个查询条件,这会增加文档的相关性评分。如果没有任何must
子句存在,至少需要满足一个should
子句。must_not
: 文档不能匹配任何must_not
子句下的查询条件。这个子句不会影响评分,它的作用是排除不相关的文档。filter
: 文档必须匹配filter
子句下的查询条件,但与must
不同的是,filter
子句不会影响文档的评分,只起到过滤的作用。
除了bool
查询之外,还有其他的复合查询类型,例如:
constant_score
查询:将原始查询转换为不计算评分的过滤查询,并给所有匹配的文档赋予相同的评分。dis_max
查询:用于指定一个查询中的多个子查询,并返回那些单个最佳匹配子查询得分最高的文档。function_score
查询:允许你修改查询结果的评分,可以通过定义不同的函数来调整最终的评分。
代码示例
1. bool 查询
bool
查询是使用最广泛的复合查询之一。它允许你通过布尔逻辑组合多个查询条件。
must
: 文档必须匹配这些条件,相当于 AND。filter
: 必须匹配,但不计算相关性分数。should
: 文档应该匹配这些条件中的至少一个,增加其相关性分数。must_not
: 文档不能匹配这些条件。
示例代码:
{
"query": {
"bool" : {
"must" : {
"term" : { "user" : "kimchy" }
},
"filter": {
"term" : { "tag" : "tech" }
},
"must_not" : {
"range" : {
"age" : { "from" : 10, "to" : 20 }
}
},
"should" : [
{ "term" : { "comment" : "cool" } },
{ "term" : { "comment" : "wonderful" } }
]
}
}
}
2. dis_max 查询
dis_max
查询会选择单个最佳匹配的查询子句来计算最终分数,而不是像 bool
查询那样合并所有匹配子句的分数。
示例代码:
{
"query": {
"dis_max" : {
"queries" : [
{ "match" : { "title" : "Quick pets" }},
{ "match" : { "body" : "Quick pets" }}
],
"tie_breaker" : 0.7
}
}
}
3. function_score 查询
function_score
允许你修改查询结果的评分,根据特定的函数调整每个文档的最终评分。
示例代码:
{
"query": {
"function_score": {
"query": { "match_all": {} },
"functions": [
{
"filter": { "match": { "test": "bar" }},
"weight": 23
},
{
"filter": { "match": { "test": "cat" }},
"weight": 42
}
],
"score_mode": "max",
"boost_mode": "multiply"
}
}
}
使用复合查询可以帮助你构建复杂的搜索逻辑,以精确地控制哪些文档应该被检索出来以及如何对它们进行排序。根据你的具体需求,你可以选择合适的复合查询类型来实现你的查询目标。
标签:匹配,复合,查询,filter,文档,子句,Elasticsearch,must From: https://blog.csdn.net/qq_44734705/article/details/145132497