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"}}
}
使用复合查询可以帮助你构建复杂的搜索逻辑,以精确地控制哪些文档应该被检索出来以及如何对它们进行排序。根据你的具体需求,你可以选择合适的复合查询类型来实现你的查询目标。