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... )
作者:半山
出处:http://www.cnblogs.com/xdao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。