실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
✅ 특정 조건을 만족하지 않는 데이터를 조회하고 싶을 때 (bool : must_not)
[사전 셋팅]
// 기존 인덱스 삭제
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"
}
POST /boards/_doc
{
"board_id": 2,
"title": "이벤트 참여 방법 안내드립니다",
"category": "광고 게시판",
"is_notice": false,
"created_at": "2025-05-02T10:30:00"
}
POST /boards/_doc
{
"board_id": 3,
"title": "익명으로 질문하고 답변 받을 수 있어요",
"category": "익명 게시판",
"is_notice": true,
"created_at": "2025-05-03T08:20:00"
}
[검색 쿼리 사용해보기]
광고 게시판의 글이 아니면서, 공지 글이 아니면서, 검색엔진의 키워드와 관련된 게시글을 조회하고 싶다고 가정하자.
// 방법 1
GET /boards/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "검색엔진" } } // 유연한 검색이 필요 (must)
],
"filter": [
{ "term": { "is_notice": false } } // 정확한 검색이 필요 (filter)
],
"must_not": [
{ "term": { "category": "광고 게시판" } }
]
}
}
}
// 방법 2
GET /boards/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "검색엔진" } } // 유연한 검색이 필요 (must)
],
"must_not": [
{ "term": { "category": "광고 게시판" } },
{ "term": { "is_notice": true } }
]
}
}
}
쿼리를 실행시켜보면 원하는 값이 출력된다.
👨🏻🏫
지금까지 bool 쿼리 중 filter, must, must_not에 대해 알아봤다. 다음 강의에서는 마지막으로 bool 쿼리의 should에 대해 알아보자.