
공고 검색
- 인덱싱 단계에서 각 필드는 용도에 따라 타입을 지정합니다
(직종/회사명은 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" 도 동일하게 매칭됩니다.
- 따라서 공백/쉼표 유무와 관계없이, 대소문자 구분 없이 유연하게 검색이 가능합니다.
- 2글자 미만 검색어: min_gram=2이므로 "a", "b" 같은 단일 글자 검색은 매칭되지 않습니다.
- 정렬: location-keyword 서브필드는 원문 "state, county" 문자열 그대로를 저장하기 때문에, 띄어쓰기/쉼표 포함 문자열의 사전순 정렬이 적용됩니다.
- 메모리/색인량: ngram(2~32)으로 토큰이 매우 많이 생기므로, 데이터가 커질수록 인덱스가 무거워집니다. 하지만, 위치 데이터는 총 3천개 정도로 고정이 되어있었기 때문에 토큰을 늘여 사용하게 되었습니다.
예시
색인 시
- "remove_commas" → "Newyork Newyork"
- "remove_white_space" → "NewyorkNewyork"
- "lowercase" → "newyorknewyork"
- ngram(2~32) 생성 → "ne", "new", "newy", ..., "newyork", ..., "yorkn", ...
검색 시 (키워드 "new york")
- "remove_white_space" → "newyork"
- "lowercase" → "newyork"
- standard 토크나이저 → 토큰 ["newyork"]
- 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 |