DATABASE - ELASTIC SEARCH - 루씬 문법 및 명령어

류정현·2024년 10월 2일

데이터 본문(data body) 검색은 검색 쿼리를 데이터 본문으로 입력하는 방식입니다. Elasticsearch의 QueryDSL을 사용하며 쿼리 또한 Json 형식으로 되어 있습니다.
가장 쉽고 많이 사용되는 것은 match 쿼리입니다. 여기서는 문법만 살펴보고 다음 검색 장에서 더 많은 쿼리들에 대해 자세히 다뤄보도록 하겠습니다. 데이터 본문 검색으로 field 필드값이 value 인 도큐먼트를 검색하기 위해서는 다음 명령을 실행합니다.

데이터 본문 검색으로 "field" 필드에서 검색어 "value" 검색

GET test/_search
{
  "query": {
    "match": {
      "field": "value"
    }
  }
}

멀티테넌시 (Multitenancy)

Elasticsearch는 여러 개의 인덱스를 한꺼번에 묶어서 검색할 수 있는 멀티테넌시를 지원합니다.logs-2018-01, logs-2018-02 … 와 같이 날짜별로 저장된 인덱스들이 있다면 이 인덱스들을 모두 logs-*/_search 명령으로 한꺼번에 검색이 가능합니다. 특히 시간순으로 따라 쌓이는 로그 데이터를 다룰 때는 인덱스를 일단위 등으로 구분하는것이 좋습니다. 나중에 필드 구조가 변경되거나 크기가 커져서 샤드 설정을 변경하거나 할 때 더욱 용이합니다.

여러 인덱스를 검색할때는 쉼표, 로 나열하거나 와일드카드 * 문자로 묶을 수 있습니다.

쉼표로 나열해서 여러 인덱스 검색

GET logs-2018-01,2018-02,2018-03/_search

와일드카드 * 를 이용해서 여러 인덱스 검색

GET logs-2018-*/_search

인덱스명 대신 _all 지정자를 사용하여 GET _all/_search 와 같이 실행하면 클러스터에 있는 모든 인덱스를 대상으로 검색이 가능합니다. 하지만 _all은 시스템 사용을 위한 인덱스 같은 곳의 데이터까지 접근하여 불필요한 작업 부하를 초래하므로 _all 은 되도록 사용하지 않도록 합니다.

검색 (Search)

인터넷 쇼핑몰에 상품이 100만개가 있을 때 검색창에 "무선 이어폰" 이라고 입력해서 시스템에 있는 전체 100만개의 상품들 중 무선 이어폰과 연관된 상품만 추려내는 과정을 검색이라고 할 수 있습니다. 검색 엔진 설정에 따라 상품명이 정확히 "무선 이어폰" 인 것만 보여줄지, "소니 무선 이어폰" 처럼 전체 상품명 중에 검색어를 포함하기만 하면 보여줄지, 가격, 출시일 등과 같이 다른 조건들에 대해서는 어떻게 영향을 받도록 할 것인지 등을 결정할 수 있을 것입니다.

상품명이 정확히 "무선 이어폰" 인 것만 검색 하도록 조건을 엄격하게 하면 표시되는 결과 수가 적어져서 내가 찾는 상품이 나타나지 않을 수 있을 것입니다. 반대로 상품 설명에 "무선""이어폰" 이 하나라도 있는 상품을 모두 검색하도록 하면 "무선 리모컨", "이어폰 케이스" 같은 상품까지 검색이 되면서 결과가 너무 많아져서 내가 찾는 상품이 묻혀 버릴 수 있을 것입니다. 품질이 높은 검색 시스템을 구현하기 위해서는 이렇게 많은 부분들을 고민해야 합니다.

Elasticsearch 는 사용자가 이런 여러가지 검색 조건들에 대해 목표로 하는 검색 기능을 구현할 수 있도록 다양한 기능들을 제공합니다. Elasticsearch 는 데이터를 실제로 검색에 사용되는 검색어인 텀(Term) 으로 분석 과정을 거쳐 저장하기 때문에 검색 시 대소문자, 단수나 복수, 원형 여부와 상관 없이 검색이 가능합니다. 이러한 Elasticsearch의 특징을 풀 텍스트 검색(Full Text Search) 이라고 하며 한국어로 전문 검색 이라고도 합니다.

Query DSL (Domain Specific Language)

Elasticsearch 는 검색을 위한 쿼리 기능을 제공합니다. 이런 데이터 시스템에서 제공하는 쿼리 기능을 Query DSL (Domain Specific Language) 이라고 이야기 하며 Elasticsearch 의 Query DSL 은 모두 json 형식으로 입력해야 합니다.

Basic 라이센스 이상에서는 표준 SQL 문으로 사용 가능한 **Elasticsearch SQL** 기능을 지원합니다. 오라클이나 MySQL 에 익숙한 사람들에게는 처음에는 편할 수 있지만 Elasticsearch 의 모든 검색 기능들을 100% 활용하지 못하기 때문에 json 형식의 쿼리가 다소 생소하더라도 차근 차근 시간을 들여 Elasticsearch 의 Query DSL 을 잘 숙지하며 활용하기를 바랍니다.

profile
사용자의 경험을 설계하고 시스템의 생명주기를 책임지는 개발자

0개의 댓글