03 ElasticSearch 검색 방식
03 ElasticSearch 검색 방식
1. Note
1. Note
- 검색방식에 대해서 고민필요
- 무엇을 검색할지, 어떻게 검색할지
- RDB에서 Where과 index에 무엇을 넣는지에 따라 속도가 다르듯이
- 각기 분석에서 이점이 뭔지 파악해야할 듯.
2. 검색
1. 기본형
1
2
3
4
5
# 요청
http://localhost:9200/member/_search
# RDB
SELECT * FROM member
2. 결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{
"took": 3, // 검색 소요 시간(ms)
"timed_out": false, // 검색 timeout 여부 (false = 정상)
"_shards": {
"total": 1, // 전체 shard 개수
"successful": 1, // 정상 처리된 shard 수
"skipped": 0, // 건너뛴 shard 수
"failed": 0 // 실패한 shard 수
},
"hits": {
"total": {
"value": 3, // 총 검색 결과 개수
"relation": "eq" // eq = 정확한 개수
},
"max_score": 1.0, // 가장 높은 검색 점수
"hits": [
{
"_index": "member", // 검색된 인덱스명
"_id": "abc123", // document 고유 ID
"_score": 1.0, // 검색 유사도 점수(match 검색 시 사용)
"_source": {
// 실제 저장된 데이터
// 등록한 JSON 값
"name": "홍길동",
"age": 30
}
},
{
"_index": "member", // 검색된 인덱스명
"_id": "def456", // document 고유 ID
"_score": 1.0, // 검색 점수
"_source": { // 실제 저장된 데이터
"name": "김철수",
"age": 28
}
}
]
}
}
3. 조회 HttpMethod
1. HttpMethod
| Method | 사용 여부 | 용도 |
|---|---|---|
GET | 많이 씀 | 전체 조회, 간단 검색 |
POST | 가장 많이 씀 | 조건 검색(JSON body 포함) |
PUT | 거의 안 씀 | 안 씀 |
DELETE | 안 씀 | 검색 API에선 안 씀 |
2. 쿼리 파라미터 패턴
1
2
# 쿼리 파라미터로 조회
GET /member/_search?q=name:홍길동
3. Post 형태
1
2
3
4
5
6
7
8
9
POST /member/_search
{
"query": {
"match": { # 검색 방식 설정함
"name": "홍길동"
}
}
}
3. ElasticSearch 검색 방식
1. 비교
| 방식 | 역할 | 특징 | Analyzer 사용 여부 | 주로 사용하는 곳 |
|---|---|---|---|---|
match | 일반 텍스트 검색 | 텍스트를 분석(토큰화)해서 검색 | O | 상품명, 게시글 제목, 설명 검색 |
term | 정확 일치 검색 | 원본 값을 그대로 정확 비교 | X | 상태값, ID, 코드값 필터 |
range | 범위 검색 | 숫자·날짜 범위 조건 검색 | X | 가격, 날짜, 수량 필터 |
bool | 조건 조합 | 여러 query를 조합하는 컨테이너 | △ (내부 query 따라 다름) | 복합 검색 조건 |
fuzzy | 오타 허용 검색 | 유사 단어(오타)까지 허용 | O | 사용자 입력 검색 |
prefix | 앞글자 검색 | 특정 문자열로 시작하는 값 검색 | X (보통) | 자동완성 |
wildcard | 패턴 검색 | *, ? 기반 문자열 패턴 매칭 | X | 유연한 문자열 검색 |
match_phrase | 문장 검색 | 단어 순서까지 고려한 정확한 문장 검색 | O | 문장 검색, 정확한 표현 검색 |
multi_match | 다중 필드 검색 | 여러 필드를 동시에 검색 | O | 제목 + 설명 + 태그 검색 |
exists | 필드 존재 여부 | 필드가 존재하는지 확인 | X | 데이터 검증 |
2. match
1. match
- Elasticsearch에서 가장 기본이 되는 텍스트 검색 방식
- 입력한 검색어를 분석기(analyzer)로 분해한 뒤, 문서의 텍스트와 비교
- 정확히 일치하지 않아도 “관련된 문서”를 찾는 방식
- 검색 품질은 BM25 기반 점수(_score)에 의해 결정
2. request
1
2
3
4
5
6
7
8
9
GET /products/_search
{
"query": {
"match": {
"title": "맥북"
}
}
}
3. term
1. term
- Elasticsearch에서 정확히 일치하는 값을 찾는 검색 방식
- 입력한 값 그대로 비교하며, analyzer(분석기)를 거치지 않음
- 텍스트를 “단어 단위로 분해하지 않고” 원문 그대로 매칭
- 주로 keyword 타입 필드(상태값, ID, 코드 등)에 사용
- 분석 기반 검색이 아니기 때문에 관련도 검색(BM25)보다는 필터에 가까운 성격
2. request
1
2
3
4
5
6
7
8
GET /products/_search
{
"query": {
"term": {
"status": "ACTIVE"
}
}
}
4. range
1. range
- 숫자, 날짜 같은 “범위 조건”을 기준으로 데이터를 검색하는 방식
- 특정 값 이상, 이하, 구간 조건을 설정할 때 사용
- 텍스트 검색이 아니라 필터링 성격이 강함
- 가격, 날짜, 수량 같은 구조화된 데이터에 주로 사용
2. request
1
2
3
4
5
6
7
8
9
10
11
GET /products/_search
{
"query": {
"range": {
"price": {
"gte": 1000000, # 이상
"lte": 3000000 # 이하
}
}
}
}
5. bool
1. bool
- 여러 검색 조건을 논리적으로 조합하는 방식 (AND / OR / NOT)
- 복잡한 검색 로직을 구성할 때 가장 핵심적으로 사용됨
- must / should / must_not / filter 구조로 조건을 분리
- 실무 검색의 대부분은 bool 안에서 구성됨
2. request
1
2
3
4
5
6
7
8
9
10
11
12
13
14
GET /products/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "맥북" } }, # 타이틀에 맥북이 필수로 들어가야하고
{ "match": { "brand": "Apple" } } # 브랜드가 애플인 것중에
],
"filter": [
{ "range": { "price": { "gte": 2000000 } } } # 가격이 200만원 이상
]
}
}
}
6. fuzzy
1. fuzzy
- 사용자가 입력한 검색어의 오타를 허용하는 검색 방식
- 철자가 정확하지 않아도 유사한 단어를 찾아줌
- 자동 보정 기능이 포함된 검색
- 자연어 입력 환경에서 사용자 경험 개선에 사용
2. request
1
2
3
4
5
6
7
8
GET /products/_search
{
"query": {
"fuzzy": {
"title": "맥북프러"
}
}
}
7. prefix
1. prefix
- 특정 문자열로 시작하는 값을 찾는 검색 방식
- 자동완성, 검색 추천 기능에서 많이 사용됨
- 입력한 값 뒤에 어떤 글자가 붙어도 모두 매칭됨
- 분석기(analyzer)를 거치지 않고 원문 기준으로 비교
2. request
1
2
3
4
5
6
7
8
GET /products/_search
{
"query": {
"prefix": {
"title": "맥"
}
}
}
8. wildcard
1. 1. wildcard
- *, ?를 이용해서 패턴 기반 검색을 하는 방식
- → 여러 글자
- ? → 한 글자
- 자유도가 높지만 데이터가 많으면 성능이 느려질 수 있음
- 정확한 키워드가 아니라 “형태 기반 검색”이 필요할 때 사용
2. request
1
2
3
4
5
6
7
8
GET /products/_search
{
"query": {
"wildcard": {
"title": "맥*"
}
}
}
9. match_phrase
1. match_phrase
- 단어의 순서와 붙어있는 위치까지 고려해서 검색
- 문장 검색이나 정확한 표현 검색에 사용됨
- 단어가 따로 떨어져 있으면 매칭되지 않음
- 자연어 검색에서 정확도를 높이는 방식
2. request
1
2
3
4
5
6
7
8
GET /products/_search
{
"query": {
"match_phrase": {
"title": "맥북 프로"
}
}
}
10. multi_match
1. multi_match
- 여러 개의 필드에서 동시에 검색을 수행하는 방식
- 예: title, description, tags 등을 한 번에 검색
- match를 여러 필드에 확장한 형태
- 실무에서 “통합 검색” 구현할 때 자주 사용됨
2. request
1
2
3
4
5
6
7
8
9
GET /products/_search
{
"query": {
"multi_match": {
"query": "맥북",
"fields": ["title", "description", "tags"] # 3군대에 맥북이 들어가야함.
}
}
}
11. exists
1. exists
- 특정 필드가 존재하는 문서만 찾는 방식
- 값이 비어있지 않고 필드 자체가 있는지 확인
- 데이터 품질 체크, 필터링 용도로 많이 사용됨
- 검색이라기보다 “데이터 존재 여부 조건”에 가까움
2. request
1
2
3
4
5
6
7
8
GET /products/_search
{
"query": {
"exists": {
"field": "price" # 가격 필드가 있는 경우에만 가져옴
}
}
}
This post is licensed under CC BY 4.0 by the author.