boosting介绍
Boosting查询允许您降低与负面查询匹配的文档的相关性评分
boosting语法
GET /_search
{
"query": {
"boosting": {
"positive": {
"term": {
"text": "apple"
}
},
"negative": {
"term": {
"text": "pie tart fruit crumble tree"
}
},
"negative_boost": 0.5
}
}
}
关键词 | 语法介绍 |
---|---|
positive | 这是主要要匹配的查询 ,只会展示positive 条件匹配的结果 |
negative | 这是要降低相关性分数的查询 |
negative_boost | 一个在0到1之间的值,用于降低与negative查询匹配的文档的相关性评分 |
查询流程
- 执行正向(Positive)查询 ElasticSearch首先执行正向查询,获取与之匹配的文档集合。这个查询是Boosting查询的主要部分。
- 执行反向(Negative)查询 然后,ElasticSearch执行反向查询,获取与之匹配的文档集合。这个查询是用来降低与之匹配文档的相关性分数。
- 计算相关性分数 对于每个文档,ElasticSearch计算其相对于正向查询的相关性分数。如果该文档也与反向查询匹配,则其分数会根据negative_boost的值进行降低。
- 如果一个文档只与正向查询匹配,则保留原始分数不变
- 如果一个文档既与正向查询又与反向查询匹配,则按new_score = old_score * negative_boost计算新的降低后的分数
- 排序返回结果 最后,ElasticSearch根据计算出的新相关性分数对匹配文档进行排序,并返回结果。
案例
场景
某电商网站,用户搜索"手机",我们希望对下面几种情况的商品评分分别进行调整:
- 如果是苹果手机,给予相对较高的权重
- 如果是较新的手机型号(2022年后上市),也给予较高权重
- 如果有"旗舰"、"Pro"等词,视为较高端机型而增加权重
- 如果是品牌为"X"的机型,则降低权重
索引创建
PUT /products
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"brand": {
"type": "keyword"
},
"release_date": {
"type": "date"
}
}
}
}
文档插入
POST /_bulk
{"index":{"_index":"products"}}
{"name":"iPhone 14 Pro Max","brand":"Apple","release_date":"2022-09-15"}
{"index":{"_index":"products"}}
{"name":"小米12S Ultra","brand":"Xiaomi","release_date":"2022-07-04"}
{"index":{"_index":"products"}}
{"name":"华为Mate 50 Pro","brand":"Huawei","release_date":"2022-11-28"}
{"index":{"_index":"products"}}
{"name":"X品牌旗舰新机","brand":"X","release_date":"2021-06-01"}
{"index":{"_index":"products"}}
{"name":"三星Galaxy S23 Ultra","brand":"Samsung","release_date":"2023-02-17"}
{"index":{"_index":"products"}}
{"name":"魅族 Pro 7S","brand":"Meizu","release_date":"2020-05-28"}
查询语句
GET products/_search
{
"query": {
"boosting": {
"positive": {
"bool": {
"should": [
{
"term": {
"brand": {
"value": "Apple"
}
}
},
{
"range": {
"release_date": {
"gte": "2022-01-01"
}
}
},
{
"regexp": {
"name": ".*旗舰|Pro.*"
}
}
]
}
},
"negative": {
"term": {
"brand": {
"value": "Xiaomi"
}
}
},
"negative_boost": 0.5
}
}
}