golang_elasticsearch 多精确值匹配

问题

比如要查找属于两种类型的物品,这个时候,term查询就不行了,需要采用terms查询。

golang中的用法

看了一下,olivere/elastic 包提供了一个 terms查询,于是高兴的直接使用了。

query := elastic.NewBoolQuery()
query = query.Filter(elastic.NewTermsQuery("status", []int{1,2}))

没想到没有效果,于是又看源码,才发现

func NewTermsQuery(name string, values ...interface{}) *TermsQuery {
    q := &TermsQuery{
        name:   name,
        values: make([]interface{}, 0),
    }
    if len(values) > 0 {
        q.values = append(q.values, values...)
    }
    return q
}

这里value是直接添加进去的,没有循环添加。

那么怎么用呢

这里直接传多参数就可以了,即query = query.Filter(elastic.NewTermsQuery("status",1,2))

改进,直接传切片

然而有时候需要传切片,这样怎么做呢?

func ToInterfaceSlice(slice interface{}) []interface{} {
    s := reflect.ValueOf(slice)
    if s.Kind() != reflect.Slice {
        panic("InterfaceSlice() given a non-slice type")
    }

    ret := make([]interface{}, s.Len())

    for i:=0; i<s.Len(); i++ {
        ret[i] = s.Index(i).Interface()
    }

    return ret
}

status := ToInterfaceSlice([]int{1,2})
query = query.Filter(elastic.NewTermsQuery("status",status... )
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值