[엘라스틱서치] 검색하기 1편

    본 포스팅에는 형태소 분석기등을 이용하여 검색을 하는 고급적인 부분들을 제외한 검색방법을 다뤄보는 포스팅이다.

     

    이전 포스팅에서 주식에 관련된 정보를 stock이라는 인덱스에 넣어보긴 했었으나, 삼성전자에 대한 레코드만 넣었기 때문에 포스팅의 편의를 위하여 최근에 말도 많고 탈도 많은 방탄소년단의 빅히트와 블랙핑크의 와이지엔터테인먼트(YG) 주식 정보를 포함하여 총 3건의 레코드를 stock 인덱스에 추가한 후 검색을 하는 형태를 진행하고자 한다.

     

     

    포스팅에 사용된 레코드 정보

    PUT /stock/_doc/1
    {
    	"stockId" : "1",
    	"stockNm" : "삼성전자",
        "stockType" : "보통주",
        "stockCd" : "005930",
        "trade" : "KOSPI",
        "current" : "59700",
        "max" : "62800",
        "min" : "42300",
        "description" : "삼성전자 주식회사는 전자 제품을 생산하며 정보통신기술에 대한 개발을 진행하고 있는 대한민국의 기업이다. 삼성전자는 삼성그룹 안에서도 가장 규모가 큰, 삼성그룹을 대표하는 기업이기도 하다. 본사는 경기도 수원시 영통구 삼성로 129 에 있다"
    }
    
    PUT /stock/_doc/2
    {
    	"stockId" : "2",
    	"stockNm" : "빅히트",
        "stockType" : "보통주",
        "stockCd" : "352820",
        "trade" : "KOSPI",
        "current" : "160000",
        "max" : "224000",
        "min" : "121000",
        "description" : "빅히트 엔터테인먼트(영어: Big Hit Entertainment Co.,Ltd.)는 대한민국의 연예기획사이다. 1997년부터 2005년까지 JYP 엔터테인먼트에서 수석 작곡가로 활동한 방시혁이 2005년 2월 1일에 설립했다. 연예·엔터테인먼트 업종에서 매니지먼트 대행, 음반 제작, 무역 사업을 하고 있다. 소속된 연예인에는 방탄소년단, 투모로우바이투게더, 이현이 있다. 초기부터 JYP와는 제휴 관계였고 전략적으로 상당히 가까운 관계에 있다. 2012년 쏘스 뮤직과 합작 걸그룹을 제작하기도 했다. 본사는 서울특별시 용산구 한강대로 40 (한강로3가)에 있으며 2019년 여자친구가 소속되어 있는 쏘스뮤직과 2020년 세븐틴과 뉴이스트 등의 그룹이 소속되어 있는 플레디스 엔터테인먼트을 인수하였다."
    }
    
    PUT /stock/_doc/3
    {
    	"stockId" : "3",
    	"stockNm" : "와이지엔터테인먼트",
        "stockType" : "보통주",
        "stockCd" : "122870",
        "trade" : "KOSDAQ",
        "current" : "39000",
        "max" : "54500",
        "min" : "29400",
        "description" : "YG 엔터테인먼트(영어: YG Entertainment)는 서태지와 아이들의 멤버였던 양현석이 그룹 해체 후 창립한 연예 기획사이다. 본사는 서울특별시 마포구 희우정로1길 3에 있다. 2009년부터는 연기자 매니지먼트를 본격적으로 시작하였고 2014년 다수의 스타급 연기자들을 영입하면서 종합 엔터테인먼트사로서의 역량을 한층 더 강화하고 있다. 2011년 11월 23일 엔터테인먼트 기업으로서는 SM 엔터테인먼트에 이어 역대 두 번째로 코스닥 직상장에 성공하였다"
    }

     

    검색 API

    검색 뿐만 아니라 엘라스틱서치에는 URI(Uniform Resource Identifier) 방식을 활용하여 간단하게 검색을 하는 방법과 QueryDSL(JSON 형태의 요청)을 사용하여 Request Body에 질의 내용을 추가하는 검색 방법을 제공하고 있다.

     

    URI방법은 간단한 반면 복잡한 쿼리 생성이 힘들기 때문에 간단한 요청을 할 경우 사용을 한다. 예를 들어 PK만 필요한 경우 QueryDSL 방식보다 URI를 활용하여 검색을 하는 편이 심플하기 때문에 어떤 케이스인가에 따라서 검색하는 방법을 선택하고 그에 맞게 개발을 하면 된다.

    그리고 두 가지 방법을 혼합하여 사용할 수 있는데 URI로 데이터를 가져온 후, JSON 형태로 정렬 등의 내용을 섞어서 호출을 하는 방식이다. 

     

     

     

    URI를 사용하는 방법

    단일필드 검색

    GET /stock/_doc/_search?q=trade:KOSPI

    위 질의는 trade라는 컬럼(필드)에 KOSPI라는 데이터가 있는 것을 가져와라는 의미이다. 

     

    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 2,
          "relation" : "eq"
        },
        "max_score" : 0.4700036,
        "hits" : [
          {
            "_index" : "stock",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 0.4700036,
            "_source" : {
              "stockId" : "1",
              "stockNm" : "삼성전자",
              "stockType" : "보통주",
              "stockCd" : "005930",
              "trade" : "KOSPI",
              "current" : "59700",
              "max" : "62800",
              "min" : "42300",
              "description" : "삼성전자 주식회사는 전자 제품을 생산하며 정보통신기술에 대한 개발을 진행하고 있는 대한민국의 기업이다. 삼성전자는 삼성그룹 안에서도 가장 규모가 큰, 삼성그룹을 대표하는 기업이기도 하다. 본사는 경기도 수원시 영통구 삼성로 129 에 있다"
            }
          },
          {
            "_index" : "stock",
            "_type" : "_doc",
            "_id" : "2",
            "_score" : 0.4700036,
            "_source" : {
              "stockId" : "2",
              "stockNm" : "빅히트",
              "stockType" : "보통주",
              "stockCd" : "352820",
              "trade" : "KOSPI",
              "current" : "160000",
              "max" : "224000",
              "min" : "121000",
              "description" : "빅히트 엔터테인먼트(영어: Big Hit Entertainment Co.,Ltd.)는 대한민국의 연예기획사이다. 1997년부터 2005년까지 JYP 엔터테인먼트에서 수석 작곡가로 활동한 방시혁이 2005년 2월 1일에 설립했다. 연예·엔터테인먼트 업종에서 매니지먼트 대행, 음반 제작, 무역 사업을 하고 있다. 소속된 연예인에는 방탄소년단, 투모로우바이투게더, 이현이 있다. 초기부터 JYP와는 제휴 관계였고 전략적으로 상당히 가까운 관계에 있다. 2012년 쏘스 뮤직과 합작 걸그룹을 제작하기도 했다. 본사는 서울특별시 용산구 한강대로 40 (한강로3가)에 있으며 2019년 여자친구가 소속되어 있는 쏘스뮤직과 2020년 세븐틴과 뉴이스트 등의 그룹이 소속되어 있는 플레디스 엔터테인먼트을 인수하였다."
            }
          }
        ]
      }
    }
    

    코스닥인 YG를 제외하고 삼성전자, 빅히트 2건을 가지고 온 것을 확인할 수 있다. 이처럼 q= 다음에 field와 검색할 value를 넣은 후 URI로 요청하면 간단하게 검색을 수행할 수 있다.

     

    다중필드 검색

    KOSPI면서, stockId가 2인 것을 검색하고 싶을 경우(물론 stockId가 PK이기 때문에 이것만 검색해도 되지만, 예시를 위해서...) 아래와 같이 AND와 같은 연산자를 사용해서 복합필드 검색을 사용할 수 있다.

    GET /stock/_doc/_search?q=trade:KOSPI AND stockId:2

     

    그러나 이렇게 간단한 검색만 수행하면 다행이겠지만 엘라스틱서치라는 검색엔진을 사용하면서 간단한 검색만을 사용하는 케이스가 많지 않다. 복잡도가 높아지면 높아질수록 오히려 URI는 급격히 사용성이 떨어지게 되는데 이럴 땐 QueryDSL을 사용하는 것이 옳을 것이다.

     

    QueryDSL을 사용하는 방법

    QueryDSL을 사용하면 원하는 검색을 다양한 옵션을 주면서 수행할 수 있게 된다. (QueryDSL은 워낙 내용이 방대하기 때문에 다음 포스팅에서 자세히 소개하고자 한다)

     

    단일필드 검색

    GET /stock/_doc/_search
    {
      "query":{
        "term":{"trade":"KOSPI"}
      }
    }
    
    GET /stock/_doc/_search
    {
      "query":{
        "bool":{
          "must":{
            "match":{"trade":"KOSPI"}
          }
        }
      }
    }

    이와같이 query라는 구문을 사용하게 되면 복잡한 쿼리를 사용할 수 있게 되는데 위의 예시는 URI 예시에서 사용한 q=trade:KOSPI와 동일한 결과를 리턴하게 된다.

     

     

    다중필드 검색

    GET /stock/_doc/_search
    {
      "query":{
        "bool":{
          "must":[
            {
              "match":{"trade":"KOSPI"}
            },
            {
              "match":{"stockId":"2"}
            }
          ]
        }
      }
    }

    다중필드 검색 결과

    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : 1.4700036,
        "hits" : [
          {
            "_index" : "stock",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 1.4700036,
            "_source" : {
              "stockId" : "1",
              "stockNm" : "삼성전자",
              "stockType" : "보통주",
              "stockCd" : "005930",
              "trade" : "KOSPI",
              "current" : "59700",
              "max" : "62800",
              "min" : "42300",
              "description" : "삼성전자 주식회사는 전자 제품을 생산하며 정보통신기술에 대한 개발을 진행하고 있는 대한민국의 기업이다. 삼성전자는 삼성그룹 안에서도 가장 규모가 큰, 삼성그룹을 대표하는 기업이기도 하다. 본사는 경기도 수원시 영통구 삼성로 129 에 있다"
            }
          }
        ]
      }
    }

    위 내용은 trade에 KOSPI라는 값과 stockId에 2라를 값을 가진 레코드를 검색해라라는 경우로 "GET /stock/_doc/_search?q=trade:KOSPI AND stockId:2"와 같은 URI 질의와 동일한 결과를 가져온다. 사실상 URI다 더 쉬워보이지만, DSL에는 다양한 설정을 할 수 있는 강점을 가지고 있다.

     

    엘라스틱엔진은 근본적으로 검색엔진이기 때문에 검색에 대한 내용이 워낙 많고 다양한 방법을 지원해준다. 그렇기에 포스팅 하나로 설명하는 것이 불가능하며 설사 하더라도 내용을 자세히 전달할 수 없을 것이기에 이번 포스팅을 기점으로 다양한 검색 방법을 설명할 예정이다.

     

     

    댓글

    Designed by JB FACTORY