elasticsearch function_score 频道页排序

本文介绍了如何使用Elasticsearch的Function_Score进行频道页内容排序优化。项目背景是提高频道页内容分发效果,选择了Elasticsearch的Function_Score结合groovy脚本动态打分。文章详细探讨了视频表ES设计、数据更新策略、性能压测以及线上灰度测试的过程,提出了如数组类型字段、离线计算部分得分、避免groovy脚本、使用min_score等优化措施。
摘要由CSDN通过智能技术生成

1:项目背景

     app的频道页面需要针对内容做分发优化,让一些优质的内容得到更多的曝光。频道页涉及一定的定向性(同一个频道页只能出现该类目的内容),并且每一个频道页的体量不是很大。思前想后不建议通过推荐系统做内容过滤,再去做分发。

2:技术方案调研

     之前对elasticsearch funciton_score 有一定的了解,但是不是很深入(阮一鸣大佬的es分享)。查找了相关文档可以通过function_score传入groovy脚本,动态打分。于是在集群上测试相关函数,并且与产品初步讨论相关纬度。通过script_score调整es的打分权重,答案是可行。

POST es_score_test/_search
{
  "_source": ["category_id", "parent_nature_id", "uid", "gmt_create","second_nature_id"],
  "from": 0,
  "size": 100,
  "query": {
    "function_score": {
      "query": {
        "match": {
          "parent_nature_id": "1"
        }
      },
      "functions": [
        {
          "gauss": {
            "gmt_create": {
              "origin": "2019-03-01T14:10:30Z",
              "scale": "6d",
              "offset": "1d"
            }
          }
        },
        {
          "field_value_factor": {
            "field": "click_cout",
            "modifier": "log1p",
            "factor": 0.1
          }
        },
        {
          "script_score": {
            "script": {
              "params": {
                        "threshold": 5,
                        "discount": 0.8,
                        "target":102
                    },
              "source": "double sortScore=0;double price =doc['second_nature_id'].value; double margin = 10; if (price < params.threshold) { sortScore = price * margin / params.target }else {sortScore = price * (1 - params.discount) * margin / params.target} return sortScore"
            }
          }
        },
        {
          "script_score": {
            "script": {
              "params": {
                        "threshold": 5,
                        "discount": 0.8,
                        "target":10
                    },
              "source": "double sortScore=0;double price =doc['second_nature_id'].value; double margin = 10000; if (price < params.threshold) { sortScore = price * margin / params.target }else {sortScore = price * (1 - params.discount) * margin / params.target} return sortScore"
            }
          }
        }
      ],
      "boost_mode": "sum"
    }
  }
}

3:我们应该通过那些纬度做(大概列举一些因素)

计算因子 权重
以下是一个使用Java语言编写的elasticsearch function_score查询的示例代码,包含所有必要的语法: ```java import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; import org.elasticsearch.index.query.functionscore.script.ScriptScoreFunctionBuilder; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import java.io.IOException; public class FunctionScoreExample { public static void main(String[] args) throws IOException { // 创建一个搜索源构建器 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 创建一个function_score查询构建器 FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery( QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.randomFunction() ); // 设置查询权重 functionScoreQueryBuilder.boost(2.0f); // 创建一个排序构建器 sourceBuilder.sort(SortBuilders.fieldSort("timestamp").order(SortOrder.DESC)); // 将查询构建器添加到搜索源构建器中 sourceBuilder.query(functionScoreQueryBuilder); // 执行查询 SearchHits hits = ElasticsearchUtil.search("index_name", sourceBuilder); // 处理查询结果 for (SearchHit hit : hits.getHits()) { // 处理每个搜索结果 } } } ``` 其中,`ElasticsearchUtil`是一个自定义的工具类,用于与elasticsearch进行交互。在此示例中,我们使用`ScoreFunctionBuilders.randomFunction()`创建了一个随机评分函数,将其与`QueryBuilders.matchAllQuery()`组合使用来创建一个简单的function_score查询。我们还设置了查询权重和排序规则,并使用`ElasticsearchUtil`执行了查询。在实际使用中,您需要根据您的具体需求进行相应的调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值