問題
比如要查找屬於兩種類型的物品,這個時候,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... )