ElasticSearch绝对评分排序(Java版本)

本文详细介绍了如何在ElasticSearch中使用function_score进行文档评分排序,包括weight、field_value_factor、random_score和衰减函数的使用方法。重点讲述了script_score的用法,允许自定义脚本计算复杂分值,实现多因素综合排序。
摘要由CSDN通过智能技术生成

在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过sort指定一个或多个排序字段。

但是使用sort排序过于绝对,它会直接忽略掉文档本身的相关度(根本不会去计算)。在很多时候这样做的效果并不好,这时候就需要对多个字段进行综合评估,得出一个最终的排序。

function\_score

在 Elasticsearch 中function_score是用于处理文档分值的 DSL,它会在查询结束后对每一个匹配的文档进行一系列的重打分操作,最后以生成的最终分数进行排序。它提供了几种默认的计算分值的函数:

1、weight:设置权重
field_value_factor:将某个字段的值进行计算得出分数。
random_score:随机得到 0 到 1 分数
衰减函数:同样以某个字段的值为标准,距离某个值越近得分越高
script_score:通过自定义脚本计算分值(很重要,一般复杂的都需要脚本)

它还有一个属性boost_mode可以指定计算后的分数与原始的_score如何合并,有以下选项:

2、multiply:将结果乘以_score

sum:将结果加上_score
min:取结果与_score的较小值
max:取结果与_score的较大值
replace:使结果替换掉_score

接下来本文将详细介绍这些函数的用法,以及它们的使用场景。

weight
weight 的用法最为简单,只需要设置一个数字作为权重,文档的分数就会乘以该权重。

他最大的用途应该就是和过滤器一起使用了,因为过滤器只会筛选出符合标准的文档,而不会去详细的计算每个文档的具体得分,所以只要满足条件的文档的分数都是 1,而 weight 可以将其更换为你想要的数值。

field\_value\_factor
field\_value\_factor 的目的是通过文档中某个字段的值计算出一个分数,它有以下属性:

field:指定字段名

 
factor:对字段值进行预处理,乘以指定的数值(默认为 1)

modifier将字段值进行加工,有以下的几个选项:

none:不处理
log:计算对数
log1p:先将字段值 +1,再计算对数
log2p:先将字段值 +2,再计算对数
ln:计算自然对数
ln1p:先将字段值 +1,再计算自然对数
ln2p:先将字段值 +2,再计算自然对数
square:计算平方
sqrt:计算平方根
reciprocal:计算倒数
举一个简单的例子,假设有一个商品索引,搜索时希望在相关度排序的基础上,销量(sales)更高的商品能排在靠前的位置,那么这条查询 DSL 可以是这样的:

{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "title": "雨伞"
                }
            },
            "field_value_factor": {
                "field": "sales",
                "modifier": "log1p",
                "factor": 0.1
            },
            "boost_mode": "sum"
        }
    }
}
这条查询会将标题中带有雨伞的商品检索出来,然后对这些文档计算一个与库存相关的分数,并与之前相关度的分数相加,对应的公式为:

_score = _score + log (1 + 0.1 * sales)


Java实现:

String index = "wareic";
String type = "product";
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index).setTypes(type);
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);

//分页
searchRequestBuilder.setFrom(0).setSize(10);

//explain为true表示根据数据相关度排序,和关键字匹配最高的排在前面
searchRequestBuilder.setExplain(true);
 
BoolQueryBuilder queryBuilder =QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.matchQuery("title&#
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值