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

原文地址:https://www.cnblogs.com/xdao/p/9262293.html

时间: 2024-10-10 06:04:19

golang_elasticsearch 多精确值匹配的相关文章

Elasticsearch工作原理

一.关于搜索引擎 各位知道,搜索程序一般由索引链及搜索组件组成. 索引链功能的实现需要按照几个独立的步骤依次完成:检索原始内容.根据原始内容来创建对应的文档.对创建的文档进行索引. 搜索组件用于接收用户的查询请求并返回相应结果,一般由用户接口.构建可编程查询语句的方法.查询语句执行引擎及结果展示组件组成. 著名的开源程序Lucene是为索引组件,它提供了搜索程序的核心索引和搜索模块,例如图中的"Index"及下面的部分:而ElasticSearch则更像一款搜索组件,它利用Lucene

MySQL Basic

摘要: 一. MySQL架构 1.1 架构简介 1.2 MariaDB编译版安装 1.3 存储引擎  1.4 并发控制及事务 二.MySQL基础 2.1 SELECT 2.2 查询缓存 2.3 索引 2.4 explain 参考资料: http://www.jianshu.com/p/91e3af27743f 一.MySQL架构 1.1 MySQL架构简介 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区进行维护,采用GPL授权许可.Oracle在收购MySQL之后,有将MyS

Linux中iptables基础命令

防火墙(Firewalld)是一种隔离工具,防范与非授权的访问,使主机更安全.它主要工作与网络或主机的边缘,对于进出本网络或主机的通信报文根据事先定义好的规则进行匹配检测:对于能够被规则所匹配到的报文做出相应的处理. 防火墙的分类: 主机防火墙:工作范围是单个主机 网络防火墙:工作范围是整个网络:网络防火墙中还可以包含主机防火墙 防火墙的实现方式: 硬件防火墙:NetScreen.CheckPoint 软件防火墙:iptables 本文所介绍的iptables就是Linux的软防火前的实现. i

第十五章 iptables

15.1 iptables简介 iptables是与最新的3.5版本Linux内核集成的IP信息包过滤系统.如果Linux系统连接到因特网或LAN.服务器或连接LAN和因特网的代理服务器,则该系统有利于在Linux系统上更好地控制IP信息包过滤和防火墙配置. 防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在Linux内核中.在信息包过滤表中,规则被分组放在我们所谓的链(chain)中.而netfilter/iptables IP信息包过滤系统

防火墙之iptables/netfilter

这篇博客的主要内容是介绍防火墙netfilter,在linux操作系统上,这是第三代防火墙.前两代是 ipfwadm和ipchains,netfilter的功能非常强大,它的地位绝不亚于其他收费系列的防火墙软件. 首先,补充自己的知识,人们常说的iptables,并不是防火墙,其实真正的防火墙是netfilter, 是编译进内核的模块,而iptables只是为了方便用户去写规则的工具,iptables写好的规则,被netfilter 读取之后立即生效. iptables包含5个链,4个表,每个链

【ES】学习3-请求体查询

1.空查询 GET /index_2014*/type1,type2/_search {} GET /_search { "from": 30, "size": 10 } 2.查询表达式 DSL只需将查询语句传递给 query 参数 GET /_search { "query": YOUR_QUERY_HERE } 查询全部 match_all 跟空查询等价 GET /_search { "query": { "ma

ElasticSearch基础入门

1.query查询表达式 Elasticsearch 提供一个丰富灵活的查询语言叫做 查询表达式 , 查询表达式(Query DSL)是一种非常灵活又富有表现力的 查询语言,它支持构建更加复杂和健壮的查询.领域特定语言 (DSL), 指定了使用一个 JSON 请求.我们可以像这样重写之前的查询所有 Smith 的搜索 : GET /megacorp/employee/_search { "query" : { "match" : { "last_name&

iptables 个人详解 从基础到精通

iptablesiptables:包过滤防火墙 firewall:防火墙,隔离工具:工作于主机或网络边缘,对于进出本主机或网络的报文根据事先定义好的检查规则做匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件: 主机防火墙 网络防火墙 ***检测系统(IDS): ·网络***检测系统 NIDS ·主机***检测系统 HIDS 对于IDS常用的检测服务有:snort等 ***防御系统(IPS),比如蜜罐 部署一套***检测系统是非常麻烦的,因为必须检测网络任意一个位置 对于IPS常用的检测服

MySQL/MariaDB的 B+ TREE索引

在我们CentOS 7+版本之后的自带镜像中的MariaDB使用的默认引擎是InnoDB引擎: InnoDB引擎自带的特点: 1.InnoDB存储引擎将数据存储于"表空间"中: 2.支持事务 3.精细锁粒度支持:表级锁.页级锁.行级锁.间隙锁: 4.支持聚集索引,主键索引以及辅助索引,自适应的Hash索引: 简要介绍一下事务: 所谓事务:就是一组原子性的SQL查询或者是一个或多个SQL语句组成的独立的操作单元: 一个最简单易懂的事务例子: A 借 B 100块钱,A 得到100,则相应