2가지 이상의 조건을 만족시키는 데이터를 조회하고 싶을 때 (bool: filter, must)
1가지 조건이 아닌 2가지 이상의 조건을 만족시키는 쿼리를 작성하려면 bool 쿼리를 활용해야 합니다. 즉, bool 쿼리는 여러 쿼리를 조합하기 위해서 사용하는 개념입니다. bool 쿼리에는 크게 4가지 기능이 있습니다.
- must: SQL문에서의
AND역할을 합니다. - filter: SQL문에서의
AND역할을 합니다. - must_not: SQL문에서의
NOT역할을 합니다. - should: 조건을 만족하면 좋고, 아니면 말고입니다.
이 중에서 2가지 조건을 전부 만족시키는 데이터를 조회하기 위해서 must와 filter에 대해 알아보겠습니다.
filter와 must 비교입니다.
filter와 must의 가장 큰 차이는 filter는 score(점수)에 영향을 주지 않고, must는 score(점수)에 영향을 준다는 점입니다. 여기서 말하는 **score(점수)**는 검색을 할 때 관련도가 얼마나 높은지를 나타내는 수치입니다.
// 기존 인덱스 삭제
DELETE /boards
// 인덱스 생성
PUT /boards
{
"mappings": {
"properties": {
"board_id": {
"type": "long"
},
"title": {
"type": "text", // 유연한 검색이 필요하므로 text 타입으로 선언
"analyzer": "nori" // 한글 데이터를 토큰으로 정확하게 나누기 위해
},
"category": {
"type": "keyword" // 유연한 검색이 필요없으므로 keyword 타입으로 선언
},
"is_notice": { // (공지글 여부)
"type": "boolean"
},
"created_at": {
"type": "date"
}
}
}
}
// 데이터 삽입
POST /boards/_doc
{
"board_id": 1,
"title": "엘라스틱서치는 정말 강력한 검색엔진이에요",
"category": "자유 게시판",
"is_notice": false,
"created_at": "2025-05-01T12:00:00"
}
GET /boards/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "검색엔진" } } // 유연한 검색이 필요 (must)
],
"filter": [
{ "term": { "category": "자유 게시판" } }, // 정확한 검색이 필요 (filter)
{ "term": { "is_notice": false } } // 정확한 검색이 필요 (filter)
]
}
}
}
댓글
GitHub 계정으로 로그인하시면 댓글과 질문을 남기실 수 있습니다. 남겨 주신 글은 이 저장소의 Discussions에 쌓입니다.