本文主要記錄es的查詢過濾的使用。html
過濾器不影響評分,而評分計算讓搜索變得複雜,並且須要CPU資源,於是儘可能使用過濾器,並且過濾器容易被緩存,進一步提高查詢的總體性能。緩存
先查詢再過濾
){ "query": { "match":{"title":"Catch-22"} }, "post_filter":{ "term":{"year":1961} } }
先過濾再查詢,速度快
){ "query": { "filtered": { "query": { "match": { "title": "Catch-22" } }, "filter": { "term": { "year": 1961 } } } } }
這種方式在2.2版本被廢棄調用,改用bool的方式elasticsearch
{ "query": { "bool": { "must": { "match": { "title": "Catch-22" } }, "filter": { "term": { "year": 1961 } } } } }
{ "post_filter":{ "range":{ "year":{ "gte":1930, "lte":1990 } } } }
{ "post_filter":{ "exists":{ "field":"year" } } }
過濾掉給定字段有值或缺失的文檔ide
{ "post_filter":{ "missing":{ "field":"year", "null_value":0, "existence":true } } }
過濾掉髮表在一個世紀之前的書post
{ "post_filter":{ "script":{ "script":"now - doc[‘year‘].value > 100", "params":{"now":2012} } } }
當查詢運行在多個索引上時,有用性能
{ "post_filter":{ "type":{ "value":"book" } } }
限定每一個分片返回的文檔數ui
{ "post_filter":{ "limit":{ "value":1 } } }
好比要指定標識符爲1,2,3的文檔spa
{ "post_filter":{ "ids":{ "type":["book"], "values":[1,2,3] } } }
{ "query": { "bool": { "must": { "range": { "year": { "gte": 1930, "lte": 1990 } } }, "should": { "term": { "available": true } }, "boost": 1 } } }