현업에서 프로젝트를 진행하다보면 "검색엔진"을 거의 무조건 사용하게 된다.
여기에서 검색엔진의 종류에는 Elasticsearch, OpenSearch, Apache Solr 등등 여러가지가 있지만,
대표적으로는 Elasticsearch를 많이 사용한다.
Elasticsearch란 무엇일까? 학습한 내용을 정리해보자.
✅ Elasticsearch 란?

Elasticsearch 는 검색, 데이터 분석에 최적화된 데이터베이스이다.
✅ Elasticsearch 주요 활용 사례
- 데이터 수집 및 분석
- ElasticSearch : 데이터 저장
- Logstash : 데이터 수집 및 가공
- Kibana : 데이터 시각화
- 검색 최적화
- 데이터가 많더라도 뛰어난 검색 속도
- 오타나 동의어를 고려해서 유연하게 검색할 수 있는 기능
✅ Elasticsearch 작동 방식 / GUI 툴
Elasticsearch와 소통하려면 REST API 라는 방식으로 통신해야 한다. (GET, POST, PUT, DELETE)
[예시]
- 데이터 삽입
curl -X POST "localhost:9200/users/_doc" -H 'Content-Type: application/json' -d
'{
"query" : {
"match_all" : {}
}
}'
- 데이터 조회
curl -X GET "localhost:9200/users/_search" -H 'Content-Type: application/json' -d
'{
"query": {
"match_all": {}
}
}'
Elasticsearch 대표적인 GUI 툴이 Kibana 이다.
5601번 포트 9200번 포트
개발자 ------------------> Kibana -----------------> Elasticsearch
✅ Elasticsearch 의 기본 용어 정리
- Elasticsearch 도 데이터베이스이다.
- Elasticsearch에 데이터를 저장/조회/수정/삭제할 수 있다.
- 데이터를 저장하기 위해 가장 먼저 인덱스(index)를 만든다.
- 인덱스를 만들 때 어떤 유형의 데이터를 넣을 지 매핑(mapping)을 정의한다.
- 테이블의 필드(field)에 맞게 데이터를 저장한다.
| MySQL | Elasticsearch |
| 테이블 (table) | 인덱스 (index) |
| 컬럼 (column) | 필드 (field) |
| 레코드 (record), 로우 (row) | 도큐먼트 (document) |
| 스키마 (schema) | 매핑 (mapping) |
✅ 역인덱스 (Inverted Index) 란?
역인덱스(Inverted Index)는 필드 값을 단어마다 쪼개서 찾기 쉽게 정리해놓은 목록이다.
Elasticsearch의 자체적인 로직으로 score(점수)를 매겨 score가 높은 순으로 도큐먼트를 조회한다.
일반적으로 검색어와 관련성이 높으면 높을수록 score(점수)가 높게 측정된다.
Elasticsearch가 역인덱스 (Inverted Index)의 기능을 가지고 있기 때문에, 단어의 순서랑 상관없이 도큐먼트를 조회해올 수 있는 것이다.
참고) 이런 작동 구조는 데이터 타입의 text 타입에 한해서만 적용된다.
[예시]
POST /products/_create/1
{
"name": "Apple 2025 맥북 에어 13 M4 10코어"
}
POST /products/_create/2
{
"name": "Apple 2024 에어팟 4세대"
}
POST /products/_create/3
{
"name": "Apple 2024 아이패드 mini A17 Pro"
}
이렇게 3개의 도큐먼트를 Elasticsearch에 저장한다고 가정한다. 그러면 Elasticsearch는 내부적으로 아래와 같이 데이터를 저장해둔다.
1. 단어 단위로 자르기
"name: "Apple 2025 맥북 에어 13 M4 10코어"
→ [ Apple, 2025, 맥북, 에어, 13, M4, 10코어 ]
"name: "Apple 2024 에어팟 4세대"
→ [ Apple, 2024, 에어팟, 4세대 ]
"name: " Apple 2024 아이패드 mini A17 Pro "
→ [ Apple, 2024, 아이패드, mini, A17, Pro ]
2. 역인덱스로 저장
products의 name 필드에 대한 역인덱스
| 토큰 (token) | 도큐먼트 id |
| Apple | [1, 2, 3] |
| 2025 | [1] |
| 맥북 | [1] |
| 에어 | [1] |
| 13 | [1] |
| M4 | [1] |
| 10코어 | [1] |
| 2024 | [2, 3] |
| 에어팟 | [2] |
| 4세대 | [2] |
| 아이패드 | [3] |
| mini | [3] |
| A17 | [3] |
| Pro | [3] |
- 필드값에서 추출돼 역인덱스에 저장된 단어를 보고 토큰(token)이라고 부른다.
- 생성된 역인덱스를 직접 눈으로 확인할 수는 없다. 시스템 내부적으로 생성될 뿐이다.
3. 검색을 할 경우 역인덱스를 활용
Apple 2024 아이패드 라고 검색하면 역인덱스를 활용해 일치하는 단어가 많은 도큐먼트를 우선적으로 조회한다.
| 토큰 (token) | 도큐먼트 id |
| Apple | [1, 2, 3] |
| 2025 | [1] |
| 맥북 | [1] |
| 에어 | [1] |
| 13 | [1] |
| M4 | [1] |
| 10코어 | [1] |
| 2024 | [2, 3] |
| 에어팟 | [2] |
| 4세대 | [2] |
| 아이패드 | [3] |
| mini | [3] |
| A17 | [3] |
| Pro | [3] |
- id가 1인 도큐먼트 : 단어 1개 일치
- id가 2인 도큐먼트 : 단어 2개 일치
- id가 3인 도큐먼트 : 단어 3개 일치
이와 같은 Elasticsearch의 자체적인 로직으로 score(점수)를 매겨 score가 높은 순 (id=3 -> id=2 -> id=1) 으로 도큐먼트를 조회한다.
일반적으로 검색어와 관련성이 높으면 높을수록 score(점수)가 높게 측정된다.
"Elasticsearch 역인덱스 (Inverted Index)의 기능을 가지고 있기 때문에, 단어의 순서랑 상관없이 도큐먼트를 조회해올 수 있는 것이다."
✅ 애널라이저 (Analyzer) 란?
문자열 (text)을 토큰으로 변환시켜주는 장치이다.

애널라이저 (Analyzer)는 내부적으로 캐릭터 필터 (Character filter), 토크나이저 (tokenizer), 토큰 필터 (token filter)라는 걸 활용해 문자열을 토큰으로 변환시킨다.
1️⃣ 캐릭터 필터 (character filter)
캐릭터 필터는 문자열을 토큰으로 자르기 전에 문자열을 다듬는 역할을 한다.
다양한 종류의 필터가 존재하며, 여러 개의 필터를 적용시킬 수 있다.
[예시]
- html_strip 필터 적용 (HTML 태그를 제거)
- (mapping 필터, pattern replace 필터)
2️⃣ 토크나이저 (tokenizer)
토크나이저는 문자열을 토큰으로 자르는 역할을 한다.
[예시]
- standard 토크나이저 (공백 또는 , , . , ! , ? 와 같은 문장 부호를 기준으로 자름)
- (classic 토크나이저, keyword 토크나이저, pattern 토크나이저 등등)
3️⃣ 토큰 필터 (token filter)
토큰 필터는 잘린 토큰을 최종적으로 다듬는 역할을 한다.
다양한 종류의 필터가 존재하며, 여러 개의 필터를 적용시킬 수 있다.
[예시]
- lowercase 필터 적용 (소문자로 변환)
- stop 필터 적용 ( a, the, is 와 같은 특별한 의미를 가지지 않는 단어 제거)
- stemmer 필터 적용 (단어의 원래 형태로 변환)
- (asciifolding 필터, synonym 필터, edge_ngram 필터, kstem 필터 등등)
elasticsearch에 기본값으로 설정되어 있는 애널라이저는 standard analyzer이다.
standard analyzer는 character filter는 설정되어 있지 않고, tokenizer는 standard로 설정되어 있고, token filter는 lowercase인 애널라이저를 뜻한다.
- tokenizer (standard) : 공백 또는 , , . , ! , ? 와 같은 문장 부호를 기준으로 자름
- token filter (lowercase) : 소문자로 변환
** 한글로 검색하려면 Nori(노리) Analyzer를 써야 한다.
✅ 매핑 (mapping) 이란 ?
매핑(mapping) 이란 도큐먼트의 각 필드가 어떤 데이터 타입을 가지고 있는지 정의하는 설정을 의미한다.
MySQL에서 테이블을 만들 때 어떤 유형의 데이터를 넣을 지 스키마(schema)를 정의하는 것처럼, Elasticsearch에서 인덱스를 만들 때 어떤 유형의 데이터를 넣을 지 매핑을 정의할 수 있다.
✅ 데이터 타입 (data type)
Elasticsearch에서 데이터 타입의 종류는 아주 많다. 그 중 자주 사용하는 데이터 타입에 대해서만 알아볼 것이다.
[숫자]
- 10억 이하의 정수만 저장하면 되는 경우 : integer
- 10억이 넘어가는 정수를 저장해야 될 수도 있는 경우 : long
- 실수 (소숫점을 가진 숫자 포함)를 저장해야 될 수도 있는 경우 : double
[문자]
- 문자열을 토큰으로 쪼개서 저장하고 싶은 경우 : text
- 유연한 검색이 필요할 때 (완전히 일치하지 않아도 비슷한 데이터를 조회해오는 방식)
- 문자열을 토큰으로 쪼개지 않고, 문자열 그대로 저장하고 싶은 경우 : keyword
- 정확한 검색이 필요할 때 (정확하게 일치할 때만 데이터를 조회해오는 방식)
- 주의) 계산에서 쓰는 값이 아니라면 숫자가 아닌 문자로 저장해야 한다 . 예를 들어 , 휴대폰 번호나 주민등록번호에 숫자를 더하거나 빼 지않는다 . 즉 , 휴대폰 번호나 주민등록번호는 숫자가 아닌 문자로 저장해야 한다 .
[기타]
- 날짜 데이터를 저장해야 하는 경우 : date
- true, false를 저장해야 하는 경우 : boolean
'Server' 카테고리의 다른 글
| [Network] SSL 인증서를 갱신하는 방법을 알아보자 (0) | 2026.03.20 |
|---|---|
| [Network] X-Forwarded-For (XFF) 란 무엇일까? (0) | 2026.03.17 |