对应72.官放文档路径:Query DSL » Compound queries
官方地址如下:
https://www.elastic.co/guide/en/elasticsearch/reference/7.2/compound-queries.html
复合查询
复合查询包含其他复合或者叶子查询,组合他们的查询结果或者分数,更改他们的行为,或者从query切换为filter上下文。复合查询分为以下查询:
Bool查询
组合must,should,must_not和filter四种子句为复合查询,must和should为query查询,must_not和filter为filter过滤上下文。
Boosting查询
返回与positive查询匹配的文档,但减少与negative查询匹配的文档的分数
Constant_score查询
一个查询,包装另一个查询,但在filter过滤器上下文中执行它。所有匹配的文档都被赋予相同的“常量”_score。
Dis_max查询
一个接受多个查询的查询,并返回与任何查询子句匹配的任何文档。当bool查询合并所有匹配查询的分数时,dis_max查询将使用单个最佳匹配查询子句的分数。
Function_score查询
使用函数修改主查询返回的分数,以考虑诸如受欢迎程度,新近度,距离或使用脚本实现的自定义算法等因素。
1. Boolean查询
2. Boosting查询
返回positive query匹配的文档并减小negative query匹配文档的分数。
您可以使用boosting查询来降级某些文档,而不必将它们从搜索结果中排除。
查询示例:
GET /_search
{
"query": {
"boosting": {
"positive": {
"term": {
"text": "apple"
}
},
"negative": {
"term": {
"text": "pie tart fruit crumble tree"
}
},
"negative_boost": 0.5
}
}
}
boosting查询的顶级参数
positive:
(必需的,查询主体对象)要运行的query查询。返回的所有文档都必须与此查询匹配。
negative:
(必需的,查询主体对象)减少匹配到文档的相关性分数的query查询。
如果返回的文档与positive查询匹配,则该 boosting查询将如下计算该文档的最终相关性得分:
1.从positive查询中获取原始的相关性分数。
2.将分数乘以negative_boost值。
negative_boost:
(必需,浮点数)介于0至1.0之间的浮点数,用于降低与negative查询匹配的文档 的相关性得分。
3. Constant score查询
包含一个过滤查询,并返回每个匹配文档的相关性得分等于boost 参数值。(恒定分数查询,可以将term查询转为filter查询,不算分数并且缓存查询,提高性能。)
查询示例:
GET /_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"user": "kimchy"
}
},
"boost": 1.2
}
}
}
constant_score查询的顶级参数:
filter
(必需的,查询主体对象)要运行的过滤查询。返回的所有文档都必须与此查询匹配。
过滤查询不计算相关性分数。为了提高性能,Elasticsearch自动缓存经常使用的过滤器查询。
boost
(可选,float)浮点数,用作与过滤查询匹配的每个文档的恒定相关性得分。默认为1.0。
4. Disjunction max查询
返回与一个或多个包含查询(查询子句/子句)匹配的文档(即单字符串多字段查询)。
如果返回文档匹配到多个查询子句,则dis_max查询会为该文档分配来自任何匹配子句的最高相关性得分,再加上任何其他匹配子查询的tie breaking increment。
(可以实现:将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回)。
请求示例:
GET /_search
{
"query": {
"dis_max": {
"queries": [
{
"term": {
"title": "Quick pets"
}
},
{
"term": {
"body": "Quick pets"
}
}
],
"tie_breaker": 0.7
}
}
}
dis_max查询的顶级参数
queries
(必须的,查询对象数组)包含一个或多个查询子句,返回的文档必须匹配一个或者多个查询。如果文档匹配到多个查询,es使用分数最高的相关性得分。
tie_breaker
(必需的,浮点数)介于0至1.0之间的浮点数,用于增加文档匹配多查询子句的相关性得分,默认是0.0。
如果一个文档匹配到多个查询子句,dis_max查询以如下方式计算文档的相关性得分:
- 使用匹配到的查询子句中评分最高的作为相关性得分。
- 将其他匹配的查询子句评分与tie_breaker相乘
- 将最高的评分与乘得的评分相加
4. Function score 查询
function_score允许你修改查询返回的文档的分数。如果分数函数计算代价很大且足以在一组过滤后的文档上计算分数,此功能将很有作用。
使用function_score,用户需要定义一个查询和一个或多个函数,用来计算查询返回文档的新分数。
function_score只能以以下一种形式运行:
GET /_search
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"boost": "5",
"random_score": {},
"boost_mode": "multiply"
}
}
}
查看function score提供的函数列表
此外,可以组合几个functions。在这种情况下,可以选择仅在文档与给定的过滤查询匹配时才应用功能
GET /_search
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"boost": "5",//整个查询的boost
"functions": [
{
"filter": {
"match": {
"test": "bar"
}
},
"random_score": {},
"weight": 23
},
{
"filter": {
"match": {
"test": "cat"
}
},
"weight": 42
}
],
"max_boost": 42,
"score_mode": "max",
"boost_mode": "multiply",
"min_score": 42
}
}
}
每个函数的过滤查询所产生的分数无关紧要
如果没有给函数提供过滤器,则等同于指定 "match_all": {}
首先,每个文档由定义的函数们决定分数
score_mode参数具体说明每个函数计算的分数如何组合起来:
multiply(默认):分数相乘
sum:分数相加
avg:分数平均值
first:使用第一个filter匹配的函数
max:使用分数最高分
min:使用分数最低分
通过参数boost_mode设置新的计算分数如何与查询分数组合起来:
multiply(默认):分数相乘
replace:只使用函数计算分数,忽略查询分数
sum:分数相加
avg:分数平均值
max:使用分数最高分
min:使用分数最低分
可以通过设置min_score设置过滤分数低的文档。
function_score提供一下几种函数:
script_score:脚本定义函数,最自由
weight:得分乘以常数
random_score:指定随机分数/(随机但是顺序一致)
field_value_factor:数值字段值参与分数计算
decay functions:gauss,linear,exp:三种衰减函数
网友评论