我想要基于多个字段的字段排序。我有一小段排序(比如,elastic.FieldSort
),我想做一些类似的事情:
searchSource := elastic.NewSearchSource()
// searchSource.SortBy(sorter...) // Unpacking of slice isn't working
我知道这个SortBy
接受单个元素作为:
searchSource.SortBy(sorter[0], sorter[1], sorter[2])
但问题是我有一个动态大小的切片。请告诉我如何实现这一点,或者有没有更好的方法?
发布于 2021-02-16 05:12:59
如果类型正确,切片解包将会起作用。
package main
import (
"fmt"
)
func print(data ...string) {
fmt.Println(data)
}
func main() {
d := []string{"hello", "world", "now"}
print(d...)
}
对于这个特定的例子,如果由于任何原因,解包仍然不能工作,有一个解决办法。
由于SortBy函数只是附加到底层排序器切片https://github.com/olivere/elastic/blob/v7.0.22/search_source.go#L160
func (s *SearchSource) SortBy(sorter ...Sorter) *SearchSource {
s.sorters = append(s.sorters, sorter...)
return s
}
你可以做到
for _, sorter := range sorters {
searchSource.SortBy(sorter)
}
发布于 2021-02-17 06:25:39
我发现了问题所在。我的代码有两个问题。
首先,我需要将切片(sorter)初始化为Sorter类型:
var sorter []elastic.Sorter
第二个问题是在弹性方面。我需要传递带有关键字类型字段的后缀keyword
,例如
var fieldName string = field.FieldName
if field.Keyword {
fieldName = field.FieldName + ".keyword"
}
然后使用此fieldName
创建NewFieldSort
。这就是为什么我得到了弹性错误404。
sorter = append(sorter, elastic.NewFieldSort(fieldName).Order(true)
代码的其余部分是相同的,我将排序器片传递给sortBy
方法:
searchSource.SortBy(sorter...)
https://stackoverflow.com/questions/66218787
复制相似问题