elasticsearch version: 7.10.1
function_score介绍
Elasticsearch 中的 function_score 查询允许你根据一组定制函数来调整每个文档的评分,从而影响搜索结果的排序文章来源:https://www.toymoban.com/news/detail-852459.html
function_score语法
GET /<索引名>/_search
{
"query": {
"function_score": {
"query": { /* 这里是你基础查询的内容 */ }, // 可选,默认为 match_all 查询
"functions": [ // 可选,定义一系列函数来修改评分
{
"filter": { /* 可选,仅对满足此过滤条件的文档应用函数 */ },
"weight": <数值>, // 直接乘以权重
"field_value_factor": { /* 基于字段值改变评分 */ },
"script_score": { /* 使用脚本计算新的评分 */ },
"linear": { /* 衰减函数之一 */ },
"exp": { /* 衰减函数之一 */ },
"gauss": { /* 衰减函数之一 */ },
/* 其他可用的函数... */
},
...
],
"score_mode": "<模式>", // 如 'multiply', 'sum', 'avg', 'first', 'max' 或 'min'
"boost_mode": "<模式>", // 如 'multiply', 'replace', 'sum', 'avg', 'max', 'min'
"max_boost": <最大提升值>, // 可选,限制评分的最大提升量
"min_score": <最小得分阈值> // 可选,只有超过此阈值的文档才会被返回
}
}
}
function_score查询流程
GET /products/_search
{
"query": {
"function_score": {
"query": { "match": { "description": "fast car" } },
"functions": [
{
"filter": { "term": { "brand": "luxury" } },
"weight": 2
},
{
"field_value_factor": {
"field": "popularity",
"modifier": "log1p",
"missing": 1
}
}
],
"score_mode": "multiply",
"boost_mode": "sum"
}
}
}
- 第一个函数给品牌为"luxury"的文档增加了两倍的权重
- 第二个函数依据popularity字段的值来调整评分,使用的是自然对数(ln(1+x))作为调整因子,缺失值默认为1
- 根据指定的score_mode,将上述两个函数生成的得分相乘
- 因为这里设置了boost_mode为sum,原始得分
function_score案例
场景
假设我们有一个电子商务平台,其中包含商品信息,想要创建一个索引来存储产品数据,并执行一个查询来找出价格合理(价格评分高)且销售量大的热门商品。文章来源地址https://www.toymoban.com/news/detail-852459.html
索引创建
PUT /products
{
"mappings": {
"properties": {
"name": { "type": "text" },
"price": { "type": "float" },
"sales_volume": { "type": "integer" }
}
}
}
文档插入
POST /products/_doc/
{
"name": "Product A",
"price": 100.0,
"sales_volume": 500
}
POST /products/_doc/
{
"name": "Product B",
"price": 75.0,
"sales_volume": 1200
}
POST /products/_doc/
{
"name": "Product C",
"price": 125.0,
"sales_volume": 200
}
POST /products/_doc/
{
"name": "Product D",
"price": 90.0,
"sales_volume": 800
}
POST /products/_doc/
{
"name": "Product E",
"price": 150.0,
"sales_volume": 300
}
POST /products/_doc/
{
"name": "Product F",
"price": 65.0,
"sales_volume": 1500
}
POST /products/_doc/
{
"name": "Product G",
"price": 85.0,
"sales_volume": 600
}
POST /products/_doc/
{
"name": "Product H",
"price": 110.0,
"sales_volume": 450
}
查询语句
GET /products/_search
{
"query": {
"function_score": {
"query": { "match_all": {} }, // 或者使用其他具体的查询条件
"functions": [
{
"field_value_factor": {
"field": "price",
"modifier": "reciprocal",
"missing": 1000.0 // 设置默认值防止除以0错误
}
},
{
"field_value_factor": {
"field": "sales_volume",
"modifier": "log1p",
"missing": 1
}
}
],
"score_mode": "multiply",
"boost_mode": "sum"
}
}
}
- 对price字段应用了reciprocal修饰符,意味着价格越低,分数越高。
- 对sakes_volume字段应用了log1p修饰符,这将根据销量给出一个更平滑的增益,销量越大,但不会过分倾斜。
- First, each document is scored by the defined functions. The parameter score_mode specifies how the computed scores are combined
- boost_mode query score and function score is multiplied (default)
到了这里,关于Elasticsearch(5) function_score的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!