Post

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.