Elasticsearch(7) field_value_factor的使用

elasticsearch version: 7.10.1
field_value_factor 是 Elasticsearch 中用于计算基于字段值的函数评分的一部分,它允许你根据文档中某个字段的值来调整该文档的评分。

field_value_factor语法

{  
  "query": {  
    "match_all": {}  
  },  
  "function_score": {  
    "functions": [  
      {  
        "field_value_factor": {  
          "field": "popularity",  
          "factor": 1,  
          "modifier": "log1p",  
          "missing": 1  
        }  
      }  
    ],  
    "score_mode": "multiply",  
    "boost_mode": "sum"  
  }  
}
{  
  "field_value_factor": {  
    "field": "your_field_name",  
    "factor": your_factor_value,  
    "modifier": "none | log | log1p | log2p | square | sqrt | reciprocal",  
    "missing": default_value_for_missing_field  
  }  
} 
  • field:这是你想要根据其值来调整评分的字段名。它应该是一个数值字段。
  • factor:一个乘数,用于调整字段值对最终评分的影响。例如,如果你想要将字段值乘以 10 来增加其影响,你可以设置 factor 为 10。
  • modifier:这是一个可选参数,它定义了如何修改字段值以计算其评分贡献。它可以是以下值之一:
    none:不进行任何修改,直接使用字段值。
    log:对字段值取自然对数。
    log1p:对字段值加 1 后取自然对数,这可以防止对 0 或负数取对数。
    log2p:对字段值加 1 后取以 2 为底的对数。
    square:计算字段值的平方。
    sqrt:计算字段值的平方根。
    reciprocal:计算字段值的倒数。
  • missing:当字段的值缺失或不存在时,使用的默认值。这确保即使某些文档缺少该字段,也可以计算一个评分。

field_value_factor案例

场景

我们想要根据产品的价格来调整搜索结果的评分。

索引创建

PUT /products  
{  
  "mappings": {  
    "properties": {  
      "title": {  
        "type": "text"  
      },  
      "price": {  
        "type": "float"  
      }  
    }  
  }  
}

文档插入

POST /products/_doc/1  
{  
  "title": "Product A",  
  "price": 100.0  
}  
  
POST /products/_doc/2  
{  
  "title": "Product B",  
  "price": 200.0  
}  
  
POST /products/_doc/3  
{  
  "title": "Product C",  
  "price": 50.0  
}

POST /products/_doc/4  
{  
  "title": "Product D",  
  "price": 150.0  
}  
  
POST /products/_doc/5  
{  
  "title": "Product E",  
  "price": 75.0  
}  
  
POST /products/_doc/6  
{  
  "title": "Product F",  
  "price": 300.0  
}  
  
POST /products/_doc/7  
{  
  "title": "Product G",  
  "price": 250.0  
}  
  
POST /products/_doc/8  
{  
  "title": "Product H",  
  "price": 125.0  
}

查询语句

GET /products/_search  
{  
  "query": {  
    "function_score": {  
      "query": {  
        "match_all": {}  
      },  
      "functions": [  
        {  
          "field_value_factor": {  
            "field": "price",  
            "factor": 1,  
            "modifier": "none",  
            "missing": 1  
          }  
        }  
      ],  
      "score_mode": "multiply",  
      "boost_mode": "replace"  
    }  
  }  
}
  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Elasticsearch 的 Java API 来实现 es8.x script_score 定制搜索结果的分数。具体实现步骤如下: 1. 创建一个 SearchRequest 对象,设置索引名称和查询条件。 2. 创建一个 ScriptScoreFunctionBuilder 对象,设置脚本语言和脚本内容。 3. 将 ScriptScoreFunctionBuilder 对象添加到 FunctionScoreQueryBuilder 中。 4. 创建一个 SearchSourceBuilder 对象,设置查询条件和排序方式。 5. 将 FunctionScoreQueryBuilder 对象添加到 SearchSourceBuilder 中。 6. 执行查询并获取结果。 以下是示例代码: ``` SearchRequest searchRequest = new SearchRequest("index_name"); QueryBuilder queryBuilder = QueryBuilders.matchQuery("field_name", "search_text"); ScriptScoreFunctionBuilder scriptScoreFunctionBuilder = new ScriptScoreFunctionBuilder( new Script(ScriptType.INLINE, "painless", "doc['field_name'].value * factor", Collections.singletonMap("factor", 2.0))); FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(queryBuilder, scriptScoreFunctionBuilder); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(functionScoreQueryBuilder); searchSourceBuilder.sort(SortBuilders.scoreSort()); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); ``` 其中,ScriptScoreFunctionBuilder 中的脚本语言为 painless,脚本内容为 doc['field_name'].value * factor,表示将文档中的某个字段的值乘以一个因子作为分数。FunctionScoreQueryBuilder 中的 queryBuilder 表示查询条件,scriptScoreFunctionBuilder 表示定制分数的方式。最后,将 FunctionScoreQueryBuilder 对象添加到 SearchSourceBuilder 中,并执行查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值