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 | 字典 |
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 复合查询的更多相关文章
- Es学习第九课, 聚合查询和复合查询
ES除了实现前几课的基本查询,也可以实现类似关系型数据库的聚合查询,如平均值sum.最小值min.最大值max等等 我们就用上一课的数据作为参考来举例 聚合查询 sum聚合 sum是一个求累加值的聚合 ...
- ES高级查询
Query Content 在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件的匹配有多好 # POST 192.168.100.1 ...
- Elasticsearch实现复合查询,高亮结果等技巧
一.Es的配置 实现es的全文检索功能的第一步,首先从与es进行连接开始,这里我使用的是es的5.x java api语法. public TransportClient esClient() thr ...
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...
- 彻底理解Oracle中的集合操作与复合查询
--Oracle中的复合查询 复合查询:包含集合运算(操作)的查询 常见的集合操作有: union: 两个查询的并集(无重复行.按第一个查询的第一列升序排序) union all:两个查询的并集(有重 ...
- Java中mongodb使用and和or的复合查询
在MongoDB的JAVA查询中对应这些问题 and查询 //条件 startsAt< curr and endsAt > curr long curr = new Date().getT ...
- thinkphp _complex 复合查询 where多个子组实现
SELECT * FROM `user` WHERE ( `mobile` = '13824653465' OR `nickname` = 'evan' OR `openid` = '14545-fd ...
- 【积累】LinqToSql复合查询结果转DataTable数据
最近的项目用到了大量的复合查询结果用于数据源,绑定到数据控件上. 为了方便,我们把它转换成DataTable的数据源形式.请看下面的示例: 1)思考自己需要的数据,然后组合,因此创建一个新的类: // ...
- tp3.2 复合查询or
tp3.2 复合查询or $where['goods_name'] = array("like","%$q%");$where['goods_sn'] = ar ...
随机推荐
- 感觉shopex现在的升级方式太慢了
我是说产品的更新,484,485是一个经典的版本,那时候免费,shopex 系统市场占用率很高.但是485以后呢,只有小版本的更新,fxw ,ekd 都是改进版本吧,没用特别大幅度的更新.5年前,10 ...
- 「雕爷学编程」Arduino动手做(28)——RGB全彩LED模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- Iterator模式C++实现
原文链接 #include <iostream> using namespace std; typedef int DATA; class Iterator; // 容器的抽象基类 cla ...
- 最全面的Android Studio使用教程
http://www.admin10000.com/document/5496.html
- CF894B Ralph And His Magic Field
题目链接:http://codeforces.com/contest/894/problem/B 题目大意: 往一个 \(n \times m\) 的网格中填数字 \((1 \le n,m \le 1 ...
- 用python selenium 单窗口单IP刷网站流量脚本
近期有朋友说需要增加自己网站的流量,故用python写了一个简单的脚本,配合IP池或者动态IP都可以刷,当然最爽的是单窗口单IP. 说明 作弊可耻! 环境 python3.8 + selenium + ...
- Istio的流量管理(实操二)(istio 系列四)
Istio的流量管理(实操二)(istio 系列四) 涵盖官方文档Traffic Management章节中的inrgess部分. 目录 Istio的流量管理(实操二)(istio 系列四) Ingr ...
- WordPress 设置图片的默认显示方式(尺寸/对齐方式/链接到)
在文章中插入图片时,我们几乎每次都要设置图片的尺寸.对齐方式和链接方式,是比较耗时费力的.其实我们可以给这几个选项设置默认参数,省去我们每次设置的麻烦. 可以将下面的代码添加到主题的 function ...
- java后端解决跨域
1 package com.zys.boot_jeep.config; import org.springframework.context.annotation.Bean; import org.s ...
- python中几个双下划线用法的含义
_ _ init() _ _(self[,...]) 我们有时在类定义写__init()__方法,但是有时又没有.__init()__方法相当于其他面向对象的编程语言中的构造方法,也就是类在实例化成对 ...