Elasticsearch 自定义评分
Elasticsearch是一个强大的搜索引擎,它默认使用基于TF-IDF(词频-逆文档频率)和BM25的评分算法来计算文档的相关性。然而,在某些场景下,默认的评分算法可能无法完全满足需求。这时,我们可以通过自定义评分来调整搜索结果的相关性。
什么是自定义评分?
自定义评分允许你根据特定的业务需求,调整文档的评分。你可以通过编写自定义的评分脚本或使用函数评分查询(Function Score Query)来实现这一点。自定义评分可以基于文档的字段值、查询条件、甚至外部数据来动态调整评分。
为什么需要自定义评分?
默认的评分算法在某些情况下可能无法准确反映文档的相关性。例如:
- 你希望根据文档的发布时间、点击量、用户评分等字段来调整评分。
- 你希望某些特定的查询条件对评分 有更大的影响。
- 你希望结合外部数据(如用户偏好)来动态调整评分。
在这些情况下,自定义评分可以帮助你更好地控制搜索结果的排序。
如何使用自定义评分?
1. 使用函数评分查询(Function Score Query)
函数评分查询是Elasticsearch中实现自定义评分的主要方式之一。它允许你在查询的基础上应用一个或多个函数来调整评分。
示例:根据发布时间调整评分
假设你有一个博客系统,希望较新的文章在搜索结果中排名更高。你可以使用 function_score
查询来实现这一点:
{
"query": {
"function_score": {
"query": {
"match": {
"content": "Elasticsearch"
}
},
"functions": [
{
"gauss": {
"publish_date": {
"origin": "now",
"scale": "10d",
"decay": 0.5
}
}
}
],
"boost_mode": "multiply"
}
}
}
在这个例子中,gauss
函数会根据文章的发布时间与当前时间的差距来调整评分。较新的文章会获得更高的评分。
输入与输出
- 输入:查询内容为 "Elasticsearch",并且希望较新的文章排名更高。
- 输出:返回的文档会根据发布时间与当前时间的差距进行调整,较新的文章会排在前面。
2. 使用自定义评分脚本
如果你需要更复杂的评分逻辑,可以使用自定义评分脚本。评分脚本允许你使用Painless脚本语言来编写自定义的评分逻辑。
示例:根据点击量和用户评分调整评分
假设你有一个电商网站,希望根据商品的点击量和用户评分来调整搜索结果的排序。你可以使用以下脚本:
{
"query": {
"function_score": {
"query": {
"match": {
"name": "laptop"
}
},
"functions": [
{
"script_score": {
"script": {
"source": "doc['clicks'].value * 0.5 + doc['rating'].value * 2"
}
}
}
],
"boost_mode": "replace"
}
}
}
在这个例子中,script_score
会根据商品的点击量和用户评分来计算一个新的评分。点击量和用户评分越高,商品的评分也会越高。
输入与输出
- 输入:查询内容为 "laptop",并且希望点击量和用户评分较高的商品排名更高。
- 输出:返回的文档会根据点击量和用户评分进行调整,点击量和评分较高的商品会排在前面。
实际应用场景
场景1:电商网站的商品搜索
在电商网站中,商品的搜索结果的排序不仅依赖于关键词匹配,还可能依赖于商品的销量、评分、库存状态等。通过自定义评分,你可以将这些因素纳入评分计算中,从而提供更符合用户需求的搜索结果。