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 ...
随机推荐
- Vue与 Vue组件部分
1.Vuex作用?哪种功能场景使用它? 答案:vue框架中状态管理. 场景有:单页面应用中,组件之间的状态.音乐播放. 登录状态.加入购物车 2.解释vuex最常用的两种属性 答案:分别State.G ...
- NetAnalyzer笔记 之 十二 NetAnalyzer 6.0 的使用方法 -- 1.初识NetAnalyzer
上次写NetAnalyzer使用方法是2016年的时候了,在后来NetAnalyzer经过了巨大的版本更变,但是因为个人原因,一直未对使用方法进行更新,现在NetAnalyzer最新的6.0已经发布了 ...
- 想学spark但是没有集群也没有数据?没关系,我来教你白嫖一个!
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是spark专题的第六篇文章,这篇文章会介绍一个免费的spark平台,我们可以基于这个平台做一些学习实验. databricks 今天要 ...
- Pyqt5_QComboBox
QComboBox 是一个集按钮和下拉选项于一体的控件,也称做下拉列表框 方法 addItem() 添加一个下拉选项 addItems() 从列表中添加下拉选项 Clear() 删除下拉选项集合中的所 ...
- 手机端页面访问PC页面自动跳手机端代码
<script> var mobileAgent = new Array("iphone", "ipod", "ipad", & ...
- js上拉刷新数据
$(window).scroll(function () { //下面这句主要是获取网页的总高度,主要是考虑兼容性所以把Ie支持的documentElement也写了,这个方法至少支持IE8 var ...
- springmvc拦截器和概念,配置!!!
用于拦截请求,过滤后再拦截 实现HandlerInterceptor接口 配置拦截器 package cn.zys.lanjieqi; import javax.servlet.http.HttpSe ...
- Flink kuduSink开发
1.继承RichSinkFunction (1)首先在构造方式传入kudu的masterAddress地址.默认表名.TableSerializationSchema.KuduTableRowConv ...
- Java中的集合(六)继承Collection的Set接口
Java中的集合(六)继承Collection的Set接口 一.Set接口的简介 Set接口和List接口都是继承自Collection接口,它与Collection接口中功能基本一致,并没有对Col ...
- (数据科学学习手札85)Python+Kepler.gl轻松制作酷炫路径动画
本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl相信很多人都听说过,作为 ...