ES在查询过程中比较多遇到符合查询,既需要多个字段过滤也需要特殊情况处理,本文简单介绍几种查询组合方便快捷查询ES。

  • bool布尔查询有一个或者多个布尔子句组成
   
filter 只过滤符合条件的文档,不计算相关系得分
must 文档必须符合must中所有的条件,会影响相关性得分
must_not 文档必须不符合must_not 中的所有条件
should 文档可以符合should中的条件
  • filter查询只过滤符合条件的文档,es会有只能缓存,因此其执行效率很高,做简单的匹配查询且不考虑算分是,推荐使用filter替代query
上下文类型 执行类型 使用方式
Query 查找和查询语句最匹配的文档,对所有文档进行相关性算分排序 query查询 bool中的must和should
Filter 查找和查询语句匹配的文档 bool中的filter和must_not或者constant_score中的filter
  • should 使用分两种情况

bool查询包含should,不包含must查询,只包含should,文档必须满足至少一个条件,minimum_should_match可以满足条件的个数或者百分比。
bool查询同时包含should和must查询,文档不必满足should中的条件,但是如果满足条件,会增加相关性得分。
dis_max query
function_score query
boosting query

filter执行原理深度剖析

1.在倒排索引中查找搜索串,获取document list。
2.为每个在倒排索引中搜索到的结果,构建一个bitset,[0, 0, 0, 1, 0, 1]
3.遍历每个过滤条件对应的bitset,优先从最稀疏的开始搜索,查找满足所有条件的document
4.caching bitset,跟踪query,在最近256个query中超过一定次数的过滤条件,缓存其bitset。对于小segment(<1000,或<3%),不缓存bitset。
5.filter大部分情况下来说,在query之前执行,先尽量过滤掉尽可能多的数据
6.如果document有新增或修改,那么cached bitset会被自动更新
7.以后只要是有相同的filter条件的,会直接来使用这个过滤条件对应的cached bitset

布尔查询是一种最常用的组合查询方式,布尔查询把多个子查询组合(combine)成一个布尔表达式,所有子查询之间的逻辑关系是与(and);只有当一个文档满足布尔查询中的所有子查询条件时,ElasticSearch引擎才认为该文档满足查询条件。布尔查询支持的子查询类型共有四种,分别是:must,should,must_not和filter:

查询字句 说明 类型
must 文档必须匹配must查询条件 数组
should 文档应该匹配should子句查询的一个或多个 数组
must_not 文档不能匹配该查询条件 数组
filter 过滤器,文档必须匹配该过滤条件,跟must子句的唯一区别是,filter不影响查询的score 字典
 
 
 
 
 
 
 
实例说明:
1.或者并且查询
sql:
select * from paper where (date="2018-10-11" or uID= 1) and pID!="7ec0e0e5-a4b0-46d7-af56-5b3eab477aea"
es:
GET blog/paper/_search
{
"query": {
"bool": {
"should": [
{"term": {"date":"2018-10-11"}},
{"term": {"uID":1}}
]
, "must_not": [
{"term": {"pID": "7ec0e0e5-a4b0-46d7-af56-5b3eab477aea"}}
]
}
}
}

2.并且或者查询

select *from paper where date= "2018-10-11" or(uid=1 and publish= 1)

GET blog/paper/_search
{
"query": {
"bool": {
"should": [
{"term": {"date": "2018-10-11"}},
{"bool": {
"must": [
{"term": {"uID": "1"}},
{"term": {"publish": true}}
]
}}
]
}
}
}

3.搜索java,elasticsearch,hadoop,spark关键字需要至少匹配2个

GET blog/paper/_search
{
"query": {
"bool": {
"should": [
{"match": {
"title": "java"
}},
{"match": {
"title": "elasticsearch"
}},
{"match": {
"title": "hadoop"
}},
{"match": {
"title": "spark"
}}
]
, "minimum_should_match": 2
}
}
}

ES 复合查询的更多相关文章

  1. Es学习第九课, 聚合查询和复合查询

    ES除了实现前几课的基本查询,也可以实现类似关系型数据库的聚合查询,如平均值sum.最小值min.最大值max等等 我们就用上一课的数据作为参考来举例 聚合查询 sum聚合 sum是一个求累加值的聚合 ...

  2. ES高级查询

    Query Content 在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件的匹配有多好 # POST 192.168.100.1 ...

  3. Elasticsearch实现复合查询,高亮结果等技巧

    一.Es的配置 实现es的全文检索功能的第一步,首先从与es进行连接开始,这里我使用的是es的5.x java api语法. public TransportClient esClient() thr ...

  4. Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

    HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

  5. 彻底理解Oracle中的集合操作与复合查询

    --Oracle中的复合查询 复合查询:包含集合运算(操作)的查询 常见的集合操作有: union: 两个查询的并集(无重复行.按第一个查询的第一列升序排序) union all:两个查询的并集(有重 ...

  6. Java中mongodb使用and和or的复合查询

    在MongoDB的JAVA查询中对应这些问题 and查询 //条件 startsAt< curr and endsAt > curr long curr = new Date().getT ...

  7. thinkphp _complex 复合查询 where多个子组实现

    SELECT * FROM `user` WHERE ( `mobile` = '13824653465' OR `nickname` = 'evan' OR `openid` = '14545-fd ...

  8. 【积累】LinqToSql复合查询结果转DataTable数据

    最近的项目用到了大量的复合查询结果用于数据源,绑定到数据控件上. 为了方便,我们把它转换成DataTable的数据源形式.请看下面的示例: 1)思考自己需要的数据,然后组合,因此创建一个新的类: // ...

  9. tp3.2 复合查询or

    tp3.2 复合查询or $where['goods_name'] = array("like","%$q%");$where['goods_sn'] = ar ...

随机推荐

  1. dockerfile定制docker的脚本文件

    Dockerfile文件详解 #指定操作系统 FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image FROM centos #使用base ...

  2. 09 基于模块wsgiref版web框架

    09 基于模块wsgiref版web框架 模块引入 真实开发中的python web程序,一般会分为两部分:       服务器程序:负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...

  3. Java中JVM相关面试题-整理

    1.JVM内存模型 •程序计数器:当前线程字所执行节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有. •Java虚拟机栈:存放基本数据类型,对象的引用,方法出口等,线程私有. •本地方 ...

  4. java判断是否是合法IP

    public boolean ipCheck(String text) { if (text != null && !text.isEmpty()) { // 定义正则表达式 Stri ...

  5. Java并发包5--同步工具CountDownLatch、CyclicBarrier、Semaphore的实现原理解析

    前言: JUC中提供了很多同步工具类,比如CountDownLatch.CyclicBarrier.Semaphore等,都可以作用同步手段来实现多线程之间的同步效果 一.CountDownLatch ...

  6. 使用interllij IDEA 写第一个Java程序

    安装interllij IDEA interllij IDEA简称IDEA,是最好用的Java集成开发环境.你只需要安装一个IDEA,就可以立马开始学习Java,不用再费心去配置Java环境. IDE ...

  7. Text Reverse(hdu1062)

    输入方式:先输入整数,再循环输入字符串. 思考:字符串中有空格.那么要在字符串大循环输入前,首先,用"getchar()"函数读取scanf_s()函数缓冲区的空格或者空行或者换行 ...

  8. JAVA反射整理总结

    //1.通过对象获取            Person p=new Person();            Class c=p.getClass();                //2.通过类 ...

  9. var、let、const三者的区别

    var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问. const用来定义常量,使用时必须初始化(即必须赋值),只能 ...

  10. Android | 超简单集成HMS ML Kit实现最大脸微笑抓拍

    前言   如果大家对HMS ML Kit 人脸检测功能有所了解,相信已经动手调用我们提供的接口编写自己的APP啦.目前就有小伙伴在调用接口的过程中反馈,不太清楚HMS ML Kit 文档中的MLMax ...