golang_elasticsearch 多精确值匹配

Posted xdao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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... )

以上是关于golang_elasticsearch 多精确值匹配的主要内容,如果未能解决你的问题,请参考以下文章

solr 通过配置多值字段动态字段来解决文本表达式查询精确到句子的问题20171214

Elasticsearch精确索引VS全文索引

ElastiSearch默认分词器

[python]Beautifulsoups有多个class值的标签精确匹配

OpenTSDB使用Grafana的Filters type注解

MySQL中的float和decimal类型有啥区别