zoukankan      html  css  js  c++  java
  • 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... )
    
    
  • 相关阅读:
    Redis
    Redis入门
    C#编程--语句(分支语句)
    C#编程--运算符
    C#编程--输入和输出
    C#编程进制转换
    C#语言课程11月10日
    C#语言课程11月9日
    C#语言课程11月7日
    C#语言课程11月6日
  • 原文地址:https://www.cnblogs.com/xdao/p/9262293.html
Copyright © 2011-2022 走看看