Filter Query(過濾查詢)
1.1 過濾查詢
其實準確來說,ES中的查詢操作分爲2種:
查詢(query)
和過濾(filter)
。查詢即是之前提到的query查詢,它 (查詢)默認會計算每個返回文檔的得分,然後根據得分排序
。而過濾(filter)只會篩選出符合的文檔,並不計算 得分,且它可以緩存文檔 。所以,單從性能考慮,過濾比查詢更快
。換句話說,
過濾適合在大範圍篩選數據,而查詢則適合精確匹配數據。一般應用時, 應先使用過濾操作過濾數據, 然後使用查詢匹配數據
。
1.2 過濾語法
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{"match_all": {}}
],
"filter": {
"range": {
"age": {
"gte": 10
}
}
}
}
}
}
NOTE:
在執行filter和query時,先執行filter在執行query
NOTE:
Elasticsearch會自動緩存經常使用的過濾器,以加快性能。
1.3 常見的過濾器類型
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"]
}
}
}
}
}
NOTE: 更多內容請參考Elastic Search官方文檔:
https://www.elastic.co/