环境:golang 1.19 + es7 + olivere
首先是一个寻常的 go 语言查询 ES 的 DDL 语句
esRandRes, _ := core.Es.Search().
Index("...").
Query(...).
From(0).
Size(20).
Do(context.Background())
我们只需要加上这句即可
SortBy(elastic.NewScriptSort(elastic.NewScript("Math.random()"),"number"))
比如
esRandRes, _ := core.Es.Search().
Index("...").
Query(...).
SortBy(elastic.NewScriptSort(elastic.NewScript("Math.random()"),"number")).
From(0).
Size(20).
Do(context.Background())
说明:
[ 以下源码均摘自 olivere:sort.go ]
显然,SortBy()函数是用来排序的,他接受一个 Sorter 接口的对象,
Sorter接口 ↓
// Sorter is an interface for sorting strategies, e.g. ScoreSort or FieldSort.
// See https://www.elastic.co/guide/en/elasticsearch/reference/7.0/search-request-sort.html.
type Sorter interface {
Source() (interface{}, error)
}
然后我们通过 NewScriptSort() 函数创建一个查询脚本
创建脚本的函数 ↓
// NewScriptSort creates and initializes a new ScriptSort.
// You must provide a script and a type, e.g. "string" or "number".
func NewScriptSort(script *Script, typ string) *ScriptSort {
return &ScriptSort{
script: script,
typ: typ,
ascending: true,
}
}
注意,这个函数有两个参数,第一个参数我们通过 NewScript() 函数创建一个脚本对象,第二个字符串类型的参数如官方注释的第二行所言:
// You must provide
a script anda type, e.g. “string” or “number”.
// 你必须提供一个类型,比如 string 或 number
这里我理解是提供第一个 NewScriptSort() 函数参数所写脚本的返回值类型,因为我填 string 是不行的,填了 number 就可以,猜测是对应随机数函数的返回类型。
相对来说,创建脚本的函数就简单多了,就仅仅是:
elastic.NewScript("Math.random()")
第一次使用 golang、olivere 和 ES ,一切都要从头摸索,灵感来自下面这个 java-es 的实现:
https://blog.csdn.net/w1014074794/article/details/120222314