Boosting Query允许在查询中为不同的子句设置不同的权重,以影响文档的相关性得分。不同于bool查询的是bool查询中只要一个子查询条件不匹配那么搜索的数据就不会出现。而Boosting Query则是降低显示的权重/优先级(即score)。这对于优化搜索结果的排序非常有用。Boosting Query有以下重要参数:
positive
:正向查询子句(希望匹配的条件),用于增加相关性得分。
negative
:负向查询子句(不希望匹配的条件),用于减少相关性得分。
negative_boost
:0到1.0之间的浮点数,用于降低与negative查询匹配的文档的相关性得分,指定负向查询的权重值越大,负向查询的影响越小。
示例:
{
"query": {
"boosting": {
"positive": { "match": { "title": "Elasticsearch" } },
"negative": { "term": { "status": "deprecated" } },
"negative_boost": 0.5
}
}
}
在上面的示例中,正向查询子句匹配标题包含"Elasticsearch"的文档,而负向查询子句匹配status
字段为"deprecated"的文档,但由于negative_boost
设置为0.5,负向查询的影响被减小了一半。
Constant Score Query会为匹配的文档分配一个恒定的相关性得分,不考虑文档的内容或其他因素。这种查询适用于只关心文档是否匹配的情况,而不关心匹配程度。Constant Score Query的参数包括:
filter
:用于指定过滤条件。示例:
{
"query": {
"constant_score": {
"filter": {
"term": { "category": "技术" }
}
}
}
}
在上面的示例中,我们使用Constant Score Query过滤了category
字段为"技术"的文档,并为它们分配了一个恒定的相关性得分。
补充:constant_score和filter区别:
constant_score和filter相似,但是有不同的作用
constant_score
:为匹配的文档分配一个固定的得分。它不关心文档与查询的实际匹配程度
filter
:过滤器用于精确地过滤文档,不影响文档的得分
Dis Max Query允许你在多个查询子句之间进行"OR"操作,并返回匹配任何一个子句的文档。这对于组合多个查询条件以获得更广泛的结果非常有用。Dis Max Query的参数包括:
queries
是一个包含多个查询的数组,每个查询都是单独的。第一个为主查询tie_breaker
:指定子句之间的权重比例。是一个介于 0 到 1 之间的浮点数,它决定了非主要查询的得分对主要查询得分的影响。默认为 0.0,表示非主要查询不影响主要查询的得分。如果设置为 1.0,那么非主要查询的得分将完全影响主要查询的得分。boost
是一个浮点数,用于调整整个 dis_max 查询的得分。默认为 1.0。示例:
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Elasticsearch" } },
{ "match": { "content": "Kibana" } }
],
"tie_breaker": 0.3,
"boost": 1.2
}
}
}
在上面的示例中,我们使用Dis Max Query执行一个标题包含"Elasticsearch"或内容包含"Kibana"的查询,其中tie_breaker
参数设置为0.3,表示子句之间的权重比例。
补充:
dis_max
将与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回。每个查询都会产生一个单独的分数,这些得分会根据 tie_breaker 和 boost 进行组合,得到一个最终的综合得分。
正常情况只有参与匹配的字段才会参与计算得分,但Elasticsearch提供了方法function_score,通过函数来对相关性评分进行二次计算
Function Score Query允许使用自定义函数来调整文档的相关性得分,这些函数可以基于文档的字段值、距离等信息来计算得分。这种查询非常适用于需要精细调整查询结果的情况。
function_score 提供了多种类型的评分函数
function_score 还提供其他辅助的参数:
先执行score_mode,再执行boost_mode
score_mode
:决定function中多种评分函数如何计算合并
max_boost
:默认FLT_MAX(float 类型的最大值),限制function中多个评分函数通过score_mode计算后最大值,如果超过max_boost限制,会将限制值作为得分分数min_score
:默认0,限制function中多个评分函数通过score_mode计算后最小值,如果小于min_score限制,会将文档过滤掉boost_mode
:决定最后结果老分数和新分数如何计算合并
示例1:
{
"query": {
"function_score": {
"query": { "match": { "title": "Elasticsearch" } },
"functions": [
{
"filter": { "term": { "category": "技术" } },
"weight": 2
},
{
"gauss": {
"date": {
"origin": "now",
"scale": "30d"
}
},
"weight": 3
}
],
"score_mode": "sum"
}
}
}
在上面的示例中,我们使用Function Score Query来执行一个标题包含"Elasticsearch"的查询,同时应用了两个自定义函数来调整得分,其中一个基于category
字段,另一个基于date
字段。
示例2:
"query": {
"function_score": {
"query": {
"match": {
"category": "技术"
}
},
"functions": [
{
"weight": 1.5,
"filter": {
"term": {
"title":"Elasticsearch"
}
}
},
{
"weight": 3,
"filter": {
"term": {
"content": "Kibana"
}
}
}
],
"min_score": 1,
"max_boost": 10,
"score_mode": "multiply",
"boost_mode": "sum"
}
}
在上面的示例中,我们使用Function Score Query来执行一个分类包含"技术"的查询,同时应用了两个自定义函数来调整得分,其中一个基于title
字段,另一个基于content
字段。最后通过min_score
、max_boost
、score_mode
、boost_mode
控制得分计算。
本文详细介绍了Elasticsearch中的Boosting Query、Constant Score Query、Dis Max Query和Function Score Query,包括它们的特性、参数说明以及使用示例。通过灵活使用这些查询类型,可以更精确地控制搜索结果,满足不同的搜索需求。希望本文对你有所帮助!有任何问题或需要进一步的帮助,请随时在评论中提出。