当前位置:   article > 正文

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

es自定义排序

背景

在项目上遇到一个需求,需要随机展示从 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)"
                }
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 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" }}   
	             }
            ]
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • random_score (没怎么用过)

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 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	// 如果文档没有该字段,则使用的值。 修饰符和因子仍然适用于它,就好像它是从文档中读取的一样。
            }
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/973106
推荐阅读
相关标签
  

闽ICP备14008679号