Elastic Search

Ch04. 데이터 검색 - 검색 API

webmaster 2025. 9. 14. 18:00
728x90

색인 시점/ 검색 시점에서의 동작 차이

  • 문장은 색인 시점에 Term으로 분해되며, 검색 시 Term이 일치해야 검색이 가능해진다.
  • 엘라스틱 서치는 색인 시점에 Analyzer를 통해 분석된 Term, 출현 빈도, 문서 번호와 같이 역색인 구조로 만들어 내부적으로 저장한다.
  • 검색 시점에는 Keyword 타입과 같은 분석이 불가능한 데이터와 Text 타입과 같은 분석이 가능한 데이터를 구분해서 분석이 가능할 경우 분석기를 이용해 분석을 수행한다.
    • 검색 시점에도 Term을 얻을 수 있으며, 해당 Term으로 역색인 구조를 이용해 문서를 찾고 이를 통해 스코어를 계산해 결과로 제공한다.

검색 질의 표현 방식

검색 API는 기본적으로 Query를 기반으로 동작하며, 조건을 URI검색, Request Body 검색으로 표현할 수 있다.

 

URI 검색

GET movie_search/_search?q=prdtYear:2018
  • Http GET 요청을 활용하는 방식으로 파라미터를 Key=value 형태로 전달하는 방식이다.
  • 파라미터로 표현할 수 있는 표현의 한계로 복잡한 Query를 작성하는 것은 불가능하다.

Request Body 검색

POST movie_search/_search
{
  "query": {
    "term": {
      "prdtYear": 2018
    }
  }
}
  • Http 요청 시, Body에 검색할 칼럼과 검색어를 JSON 형태로 표현해서 전달하는 방식
    • JSON 형태의 표현을 좀 더 효율적으로 제공하기 위해 Query DSL이라는 문법을 지원
  • 엘라스틱서치가 제공하는 검색 API를 모두 활용하기 위해서는 반드시 Request Body 방식을 이용해야 한다.

URI 검색

POST movie_search/_search?a=movieNmEn:Family
  • URI 검색은 Request Body에 비해 단순하고 사용하기 편리하지만 복잡한 질의문을 입력하기 힘들다는 단점이 있다.
  • 또한 URI 검색을 이용할 경우 엘라스틱에서 제공하는 모든 검색 옵션을 사용할 수 없다(파라미터 전달 표현법으로 한계 존재)
  • URI 검색의 장점은 빠르게 웹 브라우저를 통해 테스트할 수 있는 장점이 있다.

자주 사용하는 옵션

파라미터 기본값 설명
q - 검색을 수행할 쿼리 문자열 조건을 지정한다
df - 쿼리에 검색을 수행할 필드가 지정되지 않았을 경우 기본값으로 검색할 필드를 지정한다
analyzer 검색 대상 필드에 설정된 형태소 분석기 쿼리 문자열을 형태소 분석할 때 사용할 형태소 분석기를 지정한다
analyzer_wildcard false 접두어/와일드카드(*) 검색 활성화 여부를 지정한다
default_operator OR 두 개 이상의 검색 조건이 쿼리 문자열에 포함될 경우 검색 조건 연산자를 설정한다.
_source true 검색 결과에 문서 본문 포함 여부를 지정한다
sort - 검색 결과의 정렬 기준 필드를 지정한다
from - 검색을 시작할 문서의 위치를 설정한다
size - 반환할 검색 결과 개수를 설정한다.

 

복잡한 URI 검색

POST movie_search/_search?q-movieNmEn:* AND prdtYear: 2017&analyze_wildcard=true&from=0&size=5&sort
=_score: desc, movield:asc&_source_includes=movied, movieNm,mvoieNmEn, typeNm
  • URI 검색은 검색 조건을 몇가지만 추가해도 검색식이 너무 복잡해져서 사용하기가 불편하고 가독성도 떨어진다.
  • URI 검색은 별도의 검색을 확인할 도구가 없다거나 간단한 조회가 필요할 경우에만 사용하고, RequestBody 방식을 사용하자

Request Body 검색

POST movie_search/_search
{
  "query": {
    "query_string": {
      "default_field": "movieNmEn",
      "query": "Family"
    }
  }
}

결과

POST movie_search/_search
{
  "_source": [
    "movieId",
    "movieNm",
    "movieNmEn",
    "typeNm"
  ],
  "query": {
    "query_string": {
      "default_field": "movieNmEn",
      "query": "movieNmEn:* OR prdtYear:2017"
    }
  },
  "from": 0,
  "size": 5,
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "movieCd": {
        "order": "asc"
      }
    }
  ]
}
  • Http 요청 시, 본문에 JSON 형태로 검색 조건을 기록해서 검색을 요청한다.
  • Request Body 검색은 질의 내용을 JSON 형태로 작성하며, 이때 Query DSL이라고 불리는 DSL 문법을 사용한다.
  • QueryDSL을 사용하면 복잡한 검색 옵션도 깔끔한 JSON 구조로 표현하는 것이 가능하다.
728x90