这是一个系列的第七篇,这篇介绍了Boosting功能。该功能用来将某些字段的搜索优先级提高。

目录

什么是Boosting

有时候,我们一次搜索会搜索多个字段,但是我们希望不同字段的优先级不同。比如我们的fgo数据库,我们希望name字段的优先级比description字段高,毕竟我们认为,在name中出现的关键词更符合用户想要搜索的预期。这个时候,我们就要用到boosting功能。

回忆一下,我们搜索的排序规则,用的是score这个数。score越大代表相关性越大。所以boosting功能说到底,就是影响了score这个值。让优先级高的字段打分更高。

如何使用Boosting

Boosting的使用非常简单,只要将我们之前在multi_match中,输入的fields里面加上一点修饰符即可,代码如下:

1
2
3
4
5
6
7
8
9
GET /fgo/_search
{
"query": {
"multi_match": {
"query": "阿",
"fields": ["name^5", "description^3", "_all"]
}
}
}

注意看fileds里面的”name^5”, “description^3”, “_all”。 这个代表什么呢?这个代表,name字段如果匹配的话,分数加成5倍。description字段如果匹配的话分数加成3倍。最后,其他所有字段不需要加成(但是也要参与搜索)。

搜索到的hit如下:

1
2
3
4
5
6
7
8
9
10
11
{
"_index": "fgo",
"_type": "servant",
"_id": "1",
"_score": 4.7732615,
"_source": {
"name": "阿尔托莉雅・潘德拉贡",
"class": "Saber",
"description": "不列颠传说中的王,被称为骑士王。阿尔托莉雅是幼名,从成为王的那一天起就被称为亚瑟王。在那个骑士道如花般凋零的时代,用手中的圣剑为不列颠带来了短暂的和平与最后的繁荣。虽然史实上是男性,但在这个世界似乎是男装的丽人。"
}
}

这里面的score是4.7732615

我们再来看看,如果不加boosting,score是多少:

1
2
3
4
5
6
7
8
GET /fgo/_search
{
"query": {
"match": {
"_all":"阿"
}
}
}

返回:

1
2
3
4
5
6
7
8
9
10
11
{
"_index": "fgo",
"_type": "servant",
"_id": "1",
"_score": 1.5922375,
"_source": {
"name": "阿尔托莉雅・潘德拉贡",
"class": "Saber",
"description": "不列颠传说中的王,被称为骑士王。阿尔托莉雅是幼名,从成为王的那一天起就被称为亚瑟王。在那个骑士道如花般凋零的时代,用手中的圣剑为不列颠带来了短暂的和平与最后的繁荣。虽然史实上是男性,但在这个世界似乎是男装的丽人。"
}
}

不加boosting的话,score是1.5922375,可见boosting确实影响了搜索引擎对于相关性的评价标准。

采用了boosting之后,如果name里面有【阿】,该数据的排名会比description里面有【阿】来的更高。

总结

好了,到这里为止,一个简单的搜索引擎的各个方面都已经讲到了。本系列作为入门介绍,旨在告诉读者,ES可以做到什么。在具体开发某一个业务的时候,某些细节上还需要读者更深入地了解ES的特性。

如果读者英语足够好的话,建议在官方网站上阅读文档:Learn About the Elastic Stack | Documentation, Training & More | Elastic

如果有什么问题,欢迎在下方评论或发送邮件到kilik52@outlook.com互相探讨。


题图来源:Designed by Freepik

ElasticSearch官方教程:点此进入
Kibana官方教程:点此进入