首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于多个场的弹性响应排序

基于多个场的弹性响应排序
EN

Stack Overflow用户
提问于 2021-02-16 12:42:48
回答 2查看 96关注 0票数 0

我想要基于多个字段的字段排序。我有一小段排序(比如,elastic.FieldSort ),我想做一些类似的事情:

代码语言:javascript
代码运行次数:0
运行
复制
searchSource := elastic.NewSearchSource()
// searchSource.SortBy(sorter...)   // Unpacking of slice isn't working

我知道这个SortBy接受单个元素作为:

代码语言:javascript
代码运行次数:0
运行
复制
searchSource.SortBy(sorter[0], sorter[1], sorter[2])

但问题是我有一个动态大小的切片。请告诉我如何实现这一点,或者有没有更好的方法?

EN

回答 2

Stack Overflow用户

发布于 2021-02-16 13:12:59

如果类型正确,切片解包将会起作用。

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
func (s *SearchSource) SortBy(sorter ...Sorter) *SearchSource {
    s.sorters = append(s.sorters, sorter...)
    return s
}

你可以做到

代码语言:javascript
代码运行次数:0
运行
复制
for _, sorter := range sorters {
    searchSource.SortBy(sorter)
}
票数 0
EN

Stack Overflow用户

发布于 2021-02-17 14:25:39

我发现了问题所在。我的代码有两个问题。

首先,我需要将切片(sorter)初始化为Sorter类型:

代码语言:javascript
代码运行次数:0
运行
复制
var sorter []elastic.Sorter

第二个问题是在弹性方面。我需要传递带有关键字类型字段的后缀keyword,例如

代码语言:javascript
代码运行次数:0
运行
复制
var fieldName string = field.FieldName
if field.Keyword {
    fieldName = field.FieldName + ".keyword"
}

然后使用此fieldName创建NewFieldSort。这就是为什么我得到了弹性错误404。

代码语言:javascript
代码运行次数:0
运行
复制
sorter = append(sorter, elastic.NewFieldSort(fieldName).Order(true)

代码的其余部分是相同的,我将排序器片传递给sortBy方法:

代码语言:javascript
代码运行次数:0
运行
复制
searchSource.SortBy(sorter...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66218787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档