ScoreFunctionBuilders.exponentialDecayFunction 是Elasticsearch中的一个函数,用于实现分数衰减的功能。这个函数通常用于实现基于时间的分数衰减,例如,可以用于对文档按照其发布的时间进行排名,越新的文档分数越高。

这个函数的基本语法如下:

ScoreFunctionBuilders.exponentialDecayFunction(

    String fieldName,

    Object origin,

    String scale,

    double decay)

  1. fieldName (String): 要应用指数衰减的字段的名称。例如,这可以是文档中的某个日期字段或数值字段。
  2. origin (Object)原点: 衰减的起始点或原点。对于日期字段,这可以是一个日期字符串或日期对象。对于数值字段,这可以是一个数字。当字段的值等于此原点时,评分为最大值(未衰减)。该字段最理想的值,这个值可以得到满分(1.0)
  3. scale (String): 当值超出了原点到偏移量这段范围,它所得的分数就开始进行衰减了,衰减规模决定了这个分数衰减速度的快慢, 定义了衰减的速度或范围。对于日期字段,它可能是“days”、“weeks”等时间单位。对于数值字段,它可能是一个数值,表示衰减的速度。例如 "5m" 表示5分钟,"1h" 表示1小时等。
  4. decay (double): 衰减的速率或程度。这通常是一个0到1之间的值(默认为 0.5),表示衰减的百分比或速度。值越接近1,衰减越慢;值越接近0,衰减越快。相当于一个分界点.
  5. 偏移量(offset):与原点相差在偏移量之内的值也可以得到满分

使用指数衰减评分函数时,字段的值距离原点越远,评分就越低(即衰减)。这可以用于多种场景,如优先考虑较新的内容(使用日期字段作为fieldName)或优先考虑接近某个特定值的文档(使用数值字段作为fieldName)。

下面是一个使用exponentialDecayFunction的例子:

在这个例子中,我们对所有包含词 "Elasticsearch" 的文档进行排序,并使用 exponentialDecayFunction 根据文档的 post_date 字段来计算分数。文档的发布时间越接近当前时间,分数越高。衰减率为0.5,时间尺度为1天。


SearchRequestBuilder searchRequestBuilder = client.prepareSearch(indexName);
searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
searchRequestBuilder.addSort(SortBuilders.scoreSort().order(SortOrder.DESC));
searchRequestBuilder.setExplain(true);
 
ZonedDateTime now = ZonedDateTime.now();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.functionScoreQuery(
    new QueryStringQueryBuilder("Elasticsearch"),
    ScoreFunctionBuilders.exponentialDecayFunction(
        "post_date", 
        DateFormatters.date().format(now), 
        "1d", 0.5)
        .setWeight(2)
));
 
searchRequestBuilder.setSource(searchSourceBuilder);
SearchResponse response = searchRequestBuilder.get();

下面还有各种函数

//高斯函数
GaussDecayFunctionBuilder functionBuilder = ScoreFunctionBuilders.gaussDecayFunction("productID", origin, scale, offset, decay);
//以 e 为底的指数函数
ExponentialDecayFunctionBuilder functionBuilder = ScoreFunctionBuilders.exponentialDecayFunction("productID", origin, scale, offset, decay);
//线性函数
LinearDecayFunctionBuilder functionBuilder = ScoreFunctionBuilders.linearDecayFunction("productID", origin, scale, offset, decay);

FunctionScoreQueryBuilder query = QueryBuilders.functionScoreQuery(queryBuilder,functionBuilder).boostMode(CombineFunction.SUM);

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部