过滤查询查询(query)
和过滤(filter)
。查询即是之前提到的query查询
,它 (查询)默认会计算每个返回文档的得分,然后根据得分排序。而过滤(filter)
只会筛选出符合的文档,并不计算 得分,而且它可以缓存文档 。所以,单从性能考虑,过滤比查询更快。 换句话说过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据。
- GET /ems/emp/_search
- {
- "query": {
- "bool": {
- "must": [
- {"match_all": {}} //查询条件
- ],
- "filter": {....} //过滤条件
- }
- }
注意:
在执行 filter 和 query 时,先执行 filter 在执行 query
Elasticsearch会自动缓存经常使用的过滤器,以加快性能。
常见过滤类型有: term 、 terms 、ranage、exists、ids等filter。
term 、 terms Filter
- GET /ems/emp/_search # 使用term过滤
- {
- "query": {
- "bool": {
- "must": [
- {"term": {
- "name": {
- "value": "小黑"
- }
- }}
- ],
- "filter": {
- "term": {
- "content":"框架"
- }
- }
- }
- }
- }
- GET /dangdang/book/_search #使用terms过滤
- {
- "query": {
- "bool": {
- "must": [
- {"term": {
- "name": {
- "value": "中国"
- }
- }}
- ],
- "filter": {
- "terms": {
- "content":[
- "科技",
- "声音"
- ]
- }
- }
- }
- }
- }
ranage filter
- GET /ems/emp/_search
- {
- "query": {
- "bool": {
- "must": [
- {"term": {
- "name": {
- "value": "中国"
- }
- }}
- ],
- "filter": {
- "range": {
- "age": {
- "gte": 7,
- "lte": 20
- }
- }
- }
- }
- }
- }
exists filter
过滤存在指定字段,获取字段不为空的索引记录使用
- GET /ems/emp/_search
- {
- "query": {
- "bool": {
- "must": [
- {"term": {
- "name": {
- "value": "中国"
- }
- }}
- ],
- "filter": {
- "exists": {
- "field":"aaa"
- }
- }
- }
- }
- }
ids filter
过滤含有指定字段的索引记录
- GET /ems/emp/_search
- {
- "query": {
- "bool": {
- "must": [
- {"term": {
- "name": {
- "value": "中国"
- }
- }}
- ],
- "filter": {
- "ids": {
- "values": ["1","2","3"]
- }
- }
- }
- }
- }