Query context tính điểm liên quan, filter context chỉ trả lời có/không và được cache.
Điều kiện không cần tính điểm mà để trong must là lãng phí rõ rệt.
json
{
"query": {
"bool": {
"must": [{ "match": { "title": "laptop gaming" } }], // tinh diem
"filter": [ // khong tinh diem, cached
{ "term": { "status": "active" } },
{ "range": { "price": { "lte": 30000000 } } }
]
}
}
}Quy tắc: mọi điều kiện lọc cứng đều để trong filter — status, khoảng giá, khoảng ngày, category ID. Chỉ phần user gõ mới cần tính điểm.
must_not cũng chạy trong filter context nên cũng được cache; should thì tính điểm trừ khi nằm trong filter context.
Filter cache (node query cache) chỉ dùng lại được khi filter giống hệt nhau. Vì thế range theo now bị viết là now chính xác tới mili giây sẽ không bao giờ hit cache — dùng now/d để làm tròn xuống ngày.