复合查询是指包含字段类查询或者复合查询的类型javascript
constant_score
将查询内部的结果文档得分都设定为1或者boost的值,多用于结合bool查询实现自定义得分html
GET blog/paper/_search { "query": { "constant_score": { "filter": { "term": { "uID": "1" } } } } }
bool
布尔查询有一个或者多个布尔子句组成java
语法数组 |
说明 |
filter | 只过滤符合条件的文档,不计算相关系得分 |
must | 文档必须符合must中全部的条件,会影响相关性得分 |
must_not | 文档必须不符合must_not 中的全部条件 |
should | 文档能够符合should中的条件,会影响相关性得分缓存 |
语法语句elasticsearch
{ "query":{ "bool":{ "must":[ {} ], "must_not":[ {} ], "should":[ {} ], "filter":[ {} ], } } }
filter
filter查询只过滤符合条件的文档,es针对filter会有智能缓存,所以其执行效率很高,作简单的匹配查询且不考虑算分是,推荐使用filter替代queryoop
上下文类型 | 执行类型 | 使用方式 |
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。ui
2.为每一个在倒排索引中搜索到的结果,构建一个bitset,[0, 0, 0, 1, 0, 1]spa
3.遍历每一个过滤条件对应的bitset,优先从最稀疏的开始搜索,查找知足全部条件的document.net
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 | 字典 |
搜索java,elasticsearch,hadoop,spark关键字须要至少匹配2个
本文同步分享在 博客“羊羽”(other)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。