[Elastic search] 다중 필터 검색, 자동 완성

2025. 8. 23. 14:51·ELK

공고 검색과 자동완성 구현

공고 검색

  • 인덱싱 단계에서 각 필드는 용도에 따라 타입을 지정합니다
    (직종/회사명은 text, 급여는 scaled_float, 위치는 keyword)
  • 이 외에도 근무 형태, 요일 등 총 15개의 필터 조건 필드가 인덱싱됩니다.
  • 분석기(analyzer) 는 기본적으로 standard를 사용해 띄어쓰기 기준으로 단어를 나누고 불용어를 제거합니다.
  • 쿼리 단계에서는 페이지네이션을 위해 PIT를 발급하고, keep_alive=2m 으로 유지합니다.
  • 첫 페이지 이후는 search_after를 이용해 직전 마지막 문서의 sort 값을 이어받아 검색합니다.
  • 회사명이나 제목 검색에는 fuzzy match를 사용해 철자가 조금 달라도 매칭될 수 있게 하였습니다.
  • 여러 조건이 들어올 때는 bool 쿼리로 묶고, must에는 스코어링(match), filter에는 조건(term, range 등)을 넣습니다.
  • 정렬은 _score 외에도 생성일(createdAt)과 문서 ID(_id)를 함께 기준으로 한다.
  • 결과적으로 사용자는 검색어, 필터, 정렬, 페이지네이션이 결합된 검색 결과를 받을 수 있었습니다.

 

위치 자동완성 

  • 인덱스에 "Alabama, Autauga" 가 들어오면, 공백과 쉼표가 모두 제거되어 "alabamaautauga" 로 변환됩니다.
  • 이 문자열을 기반으로 길이 2~32의 ngram 부분 문자열 토큰이 전부 생성되어 역색인에 저장됩니다.
  • 검색어는 조금 다르게 처리됩니다.
    • "Alabama, Autauga" 라는 질의어가 들어오면, 공백만 제거되고 소문자로 변환된 뒤, standard 토크나이저가 쉼표 같은 구분자를 제거합니다.
    • 결과적으로 토큰 ["alabama", "autauga"] 가 생성됩니다.
  • match 쿼리는 이 검색 토큰들이 인덱스에 저장된 ngram 토큰과 일치하면 hit 를 반환합니다.
    • "alabama" 는 "alabamaautauga" 에서 추출된 ngram들과 매칭됩니다.
    • "autauga" 도 동일하게 매칭됩니다.
  • 따라서 공백/쉼표 유무와 관계없이, 대소문자 구분 없이 유연하게 검색이 가능합니다.
  1. 2글자 미만 검색어: min_gram=2이므로 "a", "b" 같은 단일 글자 검색은 매칭되지 않습니다.
  2. 정렬: location-keyword 서브필드는 원문 "state, county" 문자열 그대로를 저장하기 때문에, 띄어쓰기/쉼표 포함 문자열의 사전순 정렬이 적용됩니다.
  3. 메모리/색인량: ngram(2~32)으로 토큰이 매우 많이 생기므로, 데이터가 커질수록 인덱스가 무거워집니다. 하지만, 위치 데이터는 총 3천개 정도로 고정이 되어있었기 때문에 토큰을 늘여 사용하게 되었습니다.

예시

색인 시

  1. "remove_commas" → "Newyork Newyork"
  2. "remove_white_space" → "NewyorkNewyork"
  3. "lowercase" → "newyorknewyork"
  4. ngram(2~32) 생성 → "ne", "new", "newy", ..., "newyork", ..., "yorkn", ...

검색 시 (키워드 "new york")

  1. "remove_white_space" → "newyork"
  2. "lowercase" → "newyork"
  3. standard 토크나이저 → 토큰 ["newyork"]
  4. match "newyork" vs 인덱스 ngram들 → 일치 → hit

'ELK' 카테고리의 다른 글

[Elasticsearch] 인기 검색어 구현하기 (2)  (0) 2025.11.10
[Elasticsearch] 인기 검색어 구현하기 (1)  (2) 2025.11.07
Elastic search in action 4장 - 매핑  (2) 2025.08.06
Elastic search in action 3장 - 아키텍처  (4) 2025.08.05
Elastic search in action - 2장  (8) 2025.08.04
'ELK' 카테고리의 다른 글
  • [Elasticsearch] 인기 검색어 구현하기 (2)
  • [Elasticsearch] 인기 검색어 구현하기 (1)
  • Elastic search in action 4장 - 매핑
  • Elastic search in action 3장 - 아키텍처
ksngh
ksngh
웹 백엔드 개발 블로그입니다. https://github.com/ksngh
  • ksngh
    featherdale
    ksngh
  • 전체
    오늘
    어제
    • 분류 전체보기 (66)
      • 데이터베이스 (10)
      • spring (11)
      • redis (7)
      • ELK (11)
      • 회고 (6)
      • 기타 (12)
        • java (2)
        • 디자인패턴 (2)
        • 영어 (1)
        • 자바스크립트 (1)
        • graphQL (2)
        • 블록체인 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    elastic search in action
    Redis
    엘라스틱 서치
    Elasticsearch
    NORI
    PostgreSQL
    단위 테스트
    연말 회고
    단위테스트
    자료구조
    gof
    회고
    Spy
    엘라스틱서치
    Spring Core
    디자인패턴
    spring
    nori tokenizer
    NoriTokenizer
    레디스
    graphql
    인기검색어 구현
    대용량데이터베이스
    대용량 데이터 베이스
    조인의 종류
    Elastic Search
    엘라스틱 서치 인 액션
    core
    데이터베이스
    Mock
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ksngh
[Elastic search] 다중 필터 검색, 자동 완성
상단으로

티스토리툴바