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... )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM