score(점수)가 활용되는 대표적인 쿼리가 match이다. score(점수)를 활용해 관련도가 높은 도큐먼트를 우선적으로 조회해온다. 즉, 정확하게 일치하지 않아도 도큐먼트를 조회해온다. 반면, term 쿼리와 같이 조건을 정확하게 일치시키지 않으면 도큐먼트를 아예 조회해오지 않는다. 이 때문에 score(점수)를 사용하지 않는다.
filter와 must의 사용 용도는 score(점수)에 영향을 주는 쿼리인지 아닌지로 구분해서 사용해야 한다.
filter : score(점수)와 상관없는 쿼리인 경우 → ex) term
must : score(점수)와 상관있는 쿼리인 경우 → ex) match
따라서 아래 예시에서의 term 쿼리는 score(점수)와 상관없는 쿼리이므로 must가 아닌 filter 내부에서 사용하는 것이 올바른 사용 방식이다.
// 올바른 사용 방식
GET /boards/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"category": "자유 게시판"
}
},
{
"term": {
"board_id": 1
}
}
]
}
}
}
// 잘못된 방식
GET /boards/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"category": "자유 게시판"
}
},
{
"term": {
"board_id": 1
}
}
]
}
}
}
✅ filter와 must를 쉽게 구분하기
점수(score)를 활용하는 쿼리는 text 타입을 기반으로 검색을 유연하게 해주는 쿼리(match, match_phrase, multi_match 등) 밖에 없다. 즉, 정확하게 일치하지 않더라도 관련성이 있는 데이터까지 조회하는 쿼리에 대해서만 must를 사용하면 된다. 그 외에는 전부 filter를 쓰면 된다.
머릿속에 아래와 같이 연결을 시켜도 이해하기가 쉽다.
유연한 검색 필요
→ text 타입, match 쿼리
→ bool의 must
정확한 검색 필요 (정확한 값 비교)
→ text 이외의 타입, term 쿼리
→ bool의 filter
👨🏻🏫
다음 강의에서 조금 더 복잡한 쿼리에서 filter와 must를 구분해서 사용하는 연습을 해보자.