ElasticSearch 自定义排序(随机查询结果)

本文介绍了如何利用Elasticsearch的function_score查询功能,通过script_score、weight、random_score和field_value_factor等方法实现对查询结果的随机展示和调整权重,以满足特定的业务需求。
摘要由CSDN通过智能技术生成

背景

在项目上遇到一个需求,需要随机展示从 elasticsearch 中获取的查询结果,这时候想到可以通过 es 的自定义排序,来实现这个需求。自定义排序其实就是调整 es 的评分机制,达到结果的权重不同,最终实现随机查询的目的。

我们通过使用 function_score 来实现不同的评分机制。官网介绍

常见类型

function_score 查询常见有下面几种

  • script_score script 脚本评分
  • weight 字段权重评分
  • random_score 随机评分
  • field_value_factor 字段值因子评分
  • decay functions: gauss, linear, exp (没用过)

代码例子

  • script_score

这里的查询的分数默认是乘以脚本评分的结果。 如果你想禁止这个,设置 "boost_mode": "replace"

GET index/_search
{
    "query": {
        "function_score": {
            "query": {
                "match": { "field": "value" }
            },
            "script_score" : {
                "script" : {
                  "source": "Math.log(2 + doc['likes'].value)"
                }
            }
        }
    }
}
  • weight

weight函数就是将分数乘上特定的值

下面的例子在 name 字段中匹配了 aa 的文档,他们的分数将被乘以2,当 type 匹配到 bb 的时候乘以 3

GET index/_search
{
    "query": {
        "function_score": {
            "query": {
                "match": { "field": "value" }
            },
            "functions":[
	             {
		            "weight":2  ,
		            "filter": { "term": { "name": "aa" }}   
	             },
	             {
		            "weight":3  ,
		            "filter": { "term": { "type": "bb" }}   
	             }
            ]
        }
    }
}
  • random_score (没怎么用过)

random_score 生成从 0 到但不包括 1 的均匀分布的分数。

GET index/_search
{
    "query": {
        "function_score": {
            "random_score": {
                "seed": 10,
                "field": "_seq_no"
            }
        }
    }
}

  • field_value_factor

field_value_factor 函数允许您使用文档中的字段来影响分数。 它类似于使用 script_score 函数,但是,它避免了脚本的开销。 如果用于多值字段,则在计算中仅使用该字段的第一个值。

GET index/_search
{
    "query": {
        "function_score": {
            "field_value_factor": {
                "field": "likes",	// 要从文档中提取的字段。
                "factor": 1.2,	// 与字段值相乘的可选因子,默认为 1。
                "modifier": "sqrt",	// 应用于字段值的计算修饰符, none, log, log1p, log2p, ln, ln1p, ln2p, square, sqrt, or reciprocal,默认 none.
                "missing": 1	// 如果文档没有该字段,则使用的值。 修饰符和因子仍然适用于它,就好像它是从文档中读取的一样。
            }
        }
    }
}

得分计算公式: sqrt(1.2 * doc['likes'].value)

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值