⚡ 검색 성능 향상 팁

이 문서는 Elasticsearch에서 검색 쿼리 성능을 높이기 위한 실전 팁들을 정리한 문서입니다.
대용량 데이터 환경에서도 효율적인 검색을 유지하려면 반드시 알아야 할 핵심 항목들을 포함합니다.


1. 🔍 filter와 must의 분리

must vs filter 비교

항목mustfilter
점수(score)계산함계산 안 함
캐시 활용거의 불가능✅ 캐시 가능
목적relevance 기반 검색조건 필터링 (정확 매칭 등)

📌 Tip: 가능한 조건은 filter로 분리하여 쿼리 성능 향상

"bool": {
  "must": [
    { "match": { "title": "카카오" } }
  ],
  "filter": [
    { "term": { "status": "published" } }
  ]
}

2. 📦 _source 필드 최소화

  • _source는 document 전체를 반환하는 필드
  • 필요한 필드만 지정하여 I/O 비용 절감 가능
"_source": ["title", "date"]

📌 예: 수십 개 필드 중 2~3개만 필요할 때 효과적


3. 🧭 sort 필드에 keyword/숫자 사용

  • 정렬 시 text 필드는 성능 저하 발생
  • keyword, date, numeric 필드를 정렬 기준으로 설정

📌 예시:

"sort": [
  { "created_at": "desc" }
]

4. 📌 search_after로 페이지네이션

  • from + size 방식은 깊은 페이지에서 성능 저하 발생
  • search_after 사용 시 효율적이며 안정적
"search_after": ["1700000000000"]
  • 이전 검색의 마지막 sort 값을 기준으로 다음 페이지 조회

5. 🧪 bulk 처리 최적화

  • 문서 삽입/업데이트 시 /_bulk API를 활용해 여러 문서 일괄 처리
  • 단건 처리보다 성능 수십 배 향상
POST /_bulk
{ "index": { "_index": "my-index" } }
{ "title": "문서1", "content": "내용1" }
{ "index": { "_index": "my-index" } }
{ "title": "문서2", "content": "내용2" }

✅ 요약 정리

전략 항목핵심 요약
filter 적극 사용relevance 계산 불필요한 조건은 filter로 처리
_source 제한필요한 필드만 응답으로 받아 속도 개선
정렬 필드 최적화keyword, numeric, date 타입 필드를 정렬 기준으로 사용
search_after 활용깊은 페이지네이션에서 안정적인 대안
/_bulk 처리대량 데이터 삽입/수정 시 일괄 처리로 성능 향상