본문 바로가기
WIKI 기술 지식 베이스

Dashboards Query Language

원문 보기 위키 갱신

Dashboards Query Language (DQL)

출처: 문서

본문

Dashboards Query Language (DQL)

Dashboards Query Language(DQL)는 OpenSearch Dashboards에서 데이터를 필터링하는 데 사용되는 간단한 텍스트 기반 쿼리 언어예요.

DQL과 query string query(Lucene) 언어는 Discover와 Dashboards에서 선택할 수 있는 두 가지 검색 창 언어 옵션이에요. 이 페이지는 DQL 구문에 대한 참조 자료를 제공해요. Lucene 구문에 대한 내용은 Query string query를 참고하세요. 구문 비교는 명령어 빠른 참조를 참고하세요.

기본적으로 OpenSearch Dashboards는 DQL 구문을 사용해요. query string query(Lucene)로 전환하려면, 다음 이미지와 같이 검색 상자 옆의 DQL 버튼을 선택한 다음 On 스위치를 토글하세요.

Dashboard에서 DQL 툴바를 사용한 검색어 검색

구문이 Lucene으로 바뀌어요. 다시 DQL로 전환하려면 Lucene 버튼을 선택하고 Off 스위치를 토글하세요.

분석된 텍스트에 대한 쿼리

쿼리를 실행할 때는 필드가 분석되는 필드인지(text 타입) 분석되지 않는 필드인지(keyword 타입) 파악하는 것이 중요해요. 검색 동작에 큰 영향을 미치기 때문이에요. 분석되는 필드에서는 텍스트가 토큰화와 필터링을 거치지만, 분석되지 않는 필드는 정확한 값을 그대로 저장해요. wind 같은 단순 필드 쿼리의 경우, 분석되는 필드를 대상으로 검색하면 대소문자와 관계없이 wind가 포함된 문서가 매칭되지만, keyword 필드에 같은 쿼리를 실행하면 전체 문자열이 정확히 일치해야 해요. 분석되는 필드에 대한 자세한 내용은 Text analysis를 참고하세요.

설정

OpenSearch Dashboards에서 이 튜토리얼을 따라 하려면 다음 설정 단계를 펼쳐 보세요.

설정 {: .text-delta}

다음 단계에 따라 쿼리에 사용할 샘플 데이터를 준비하세요.

1단계: 인덱스 매핑 설정

메인 메뉴에서 Management > Dev Tools를 선택해 Dev Tools를 열어요. 다음 요청을 전송해서 인덱스 매핑을 생성하세요:

PUT testindex
{
  "mappings" : {
    "properties" :  {
      "date" : {
        "type" : "date",
        "format" : "yyyy-MM-dd"
      }
    }
  }
}

{% include copy-curl.html %}

2단계: 인덱스에 문서 수집

Dev Tools에서 다음 문서들을 인덱스에 수집하세요:

PUT /testindex/_doc/1
{
  "title": "The wind rises",
  "description": "A biographical film",
  "media_type": "film",
  "date": "2013-07-20",
  "page_views": 100
}

{% include copy-curl.html %}

PUT /testindex/_doc/2
{
  "title": "Gone with the wind",
  "description": "A well-known 1939 American epic historical film",
  "media_type": "film",
  "date": "1939-09-09",
  "page_views": 200
}

{% include copy-curl.html %}

PUT /testindex/_doc/3
{
  "title": "Chicago: the historical windy city",
  "media_type": "article",
  "date": "2023-07-29",
  "page_views": 300
}

{% include copy-curl.html %}

PUT /testindex/_doc/4
{
  "article title": "Wind turbines",
  "media_type": "article",
  "format": "2*3"
}

{% include copy-curl.html %}

3단계: 인덱스 패턴 생성

다음 단계에 따라 인덱스의 인덱스 패턴을 생성하세요:

  1. 메인 메뉴에서 Management > Dashboards Management를 선택하세요.
  2. Index patterns를 선택한 다음 Create index pattern을 선택하세요.
  3. Index pattern name에 testindex*를 입력하세요. Next step을 선택하세요.
  4. Time field에서 I don't want to use the time filter를 선택하세요.
  5. Create index pattern을 선택하세요.

인덱스 패턴에 대한 자세한 내용은 Index patterns를 참고하세요.

4단계: Discover로 이동해서 인덱스 패턴 선택

메인 메뉴에서 Discover를 선택하세요. 왼쪽 상단에서 Index patterns 드롭다운 목록에서 testindex*를 선택하세요. 메인 패널에 인덱스의 문서들이 표시되고, 이제 이 페이지에서 설명하는 DQL 쿼리들을 직접 해볼 수 있어요.

객체 필드와 중첩 필드 섹션에는 해당 섹션의 쿼리를 시도하는 데 필요한 추가 설정 링크가 있어요. {: .note}

DQL 및 query string query 빠른 참조

다음 표는 두 쿼리 언어의 명령어를 빠르게 참조할 수 있게 정리한 것이에요.

기능 DQL Query string query (Lucene)
기본 용어 검색 wind wind
여러 용어 wind gone (wind 또는 gone이 포함된 문서를 찾음) wind gone (wind 또는 gone이 포함된 문서를 찾음)
정확한 구문 검색 "wind rises" "wind rises"
특정 필드 검색 title: wind title:wind
필드 존재 여부 description:* _exists_:description
필드 내 여러 용어 title: (wind OR rises)

title:(wind OR rises)
공백이 포함된 필드 article*title: wind article\ title:wind
특수 문자 이스케이프 format: 2\*3 format:2\*3
여러 필드 검색 title: wind OR description: film title:wind OR description:film
중첩 필드 검색 중첩 필드 참고 지원 안 함
숫자 범위 page_views >= 100 and page_views <= 300

not page_views: 100 (page_views 필드가 없는 문서도 결과에 포함됨)

범위 참고
page_views:[100 TO 300]

page_views:(>=100 AND <=300)

page_views:(+>=100 +<=300)

page_views:[100 TO *]

page_views:>=100

NOT page_views:100 (page_views 필드가 없는 문서도 결과에 포함됨)

Ranges 참고
날짜 범위 date >= "1939-01-01" and date <= "2013-12-31"

not date: "1939-09-08"
date:[1939-01-01 TO 2013-12-31]

NOT date:1939-09-08

모든 숫자 범위 구문 구조 지원
배타적 범위 지원 안 함 page_views: {100 TO 300} (page_views가 100과 300 사이인 문서를 반환하되, 100과 300은 제외)
불리언 AND media_type: film AND page_views: 100

media_type: film and page_views: 100
media_type:film AND page_views:100

+media_type:film +page_views:100
불리언 NOT NOT media_type: article

not media_type: article
NOT media_type:article

-media_type:article
불리언 OR title: wind OR description: film

title: wind or description: film
title: wind OR description: film
필수/금지 연산자 지원 안 함 +(필수 연산자)와 -(금지 연산자)를 모두 지원

+title:wind -media_type:article (title에는 wind가 포함되지만 media_type에는 article이 포함되지 않은 문서를 반환)
와일드카드 title: wind*

titl*: wind

구문 검색(따옴표 안)에서는 와일드카드를 지원하지 않음

*(여러 문자)만 지원
title:wind* 또는 title:w?nd

필드 이름의 와일드카드는 지원하지 않음

구문 검색(따옴표 안)에서는 와일드카드를 지원하지 않음

*(여러 문자)와 ?(한 문자) 지원
정규 표현식 지원 안 함 title:/w[a-z]nd/
퍼지 검색 지원 안 함 title:wind~2
근접 검색 지원 안 함 "wind rises"~2
용어 부스팅 지원 안 함 title:wind^2
예약 문자 \ ( ) : < > " * `+ - = &&

용어 검색

기본적으로 DQL은 인덱스에서 기본 필드로 설정된 필드를 검색해요. 기본 필드가 설정되어 있지 않으면 DQL은 모든 필드를 검색해요. 예를 들어 다음 쿼리는 어떤 필드에든 rises 또는 wind라는 단어가 포함된 문서를 검색해요:

rises wind

{% include copy.html %}

앞선 쿼리는 순서와 관계없이 검색어 중 하나라도 나타나는 문서를 매칭해요. 기본적으로 DQL은 검색어를 or로 결합해요. 검색어가 포함된 불리언 표현식을 만드는 방법은 불리언 연산자를 참고하세요.

구문(순서가 있는 단어 나열)을 검색하려면 텍스트를 따옴표로 감싸세요. 예를 들어 다음 쿼리는 "wind rises"라는 정확한 텍스트를 검색해요:

"wind rises"

{% include copy.html %}

하이픈은 Lucene의 예약 문자예요. 검색어에 하이픈이 포함되어 있으면 DQL이 Lucene 구문으로 전환하라는 안내를 표시할 수 있어요. 이를 피하려면 구문 검색에서는 검색어를 따옴표로 감싸고, 일반 검색에서는 하이픈을 생략하세요. {: .tip}

예약 문자

다음은 DQL의 예약 문자 목록이에요:

\, (, ), :, <, >, ", *

예약 문자는 백슬래시(\)로 이스케이프하세요. 예를 들어 2*3이라는 표현식을 검색하려면 쿼리를 2\*3으로 지정해요:

2\*3

{% include copy.html %}

필드에서 검색

특정 필드에서 텍스트를 검색하려면 콜론 앞에 필드 이름을 지정하세요:

title: rises wind

{% include copy.html %}

검색 대상 필드의 애널라이저가 쿼리 텍스트를 토큰으로 파싱하고, 그 토큰 중 하나라도 나타나는 문서를 매칭해요.

DQL은 공백 문자를 무시하기 때문에 title:rises wind와 title: rises wind는 같은 쿼리예요. {: .tip}

공백이 포함된 필드 이름을 참조할 때는 와일드카드를 사용하세요. 예를 들어 article*title은 article title 필드와 매칭돼요. {: .tip}

필드 이름

콜론 앞에 필드 이름을 지정하세요. 다음 표는 필드 이름이 들어간 예제 쿼리를 보여줘요.

쿼리 문서가 매칭되기 위한 조건 testindex 인덱스에서 매칭되는 문서
title: wind title 필드에 wind라는 단어가 포함돼요. 1, 2
title: (wind OR windy) title 필드에 wind 또는 windy라는 단어가 포함돼요. 1, 2, 3
title: "wind rises" title 필드에 wind rises라는 구문이 포함돼요. 1
title.keyword: The wind rises title.keyword 필드가 The wind rises와 정확히 일치해요. 1
title*: wind title로 시작하는 모든 필드(예: title, title.keyword)에 wind라는 단어가 포함돼요. 1, 2
article*title: wind article로 시작하고 title로 끝나는 필드에 wind라는 단어가 포함돼요. article title 필드와 매칭돼요. 4
description:* description 필드가 존재하는 문서예요. 1, 2

와일드카드

DQL은 검색어와 필드 이름 모두에서 와일드카드(*만 지원)를 사용할 수 있어요. 예를 들어 다음과 같아요:

t*le: *wind and rise*

{% include copy.html %}

범위

DQL은 >, <, >=, <= 연산자를 사용한 숫자 부등식을 지원해요. 예를 들어 다음과 같아요:

page_views > 100 and page_views <= 300

{% include copy.html %}

범위 연산자는 날짜에도 사용할 수 있어요. 예를 들어 다음 쿼리는 2013~2023 범위(양 끝 포함)에 속한 날짜가 포함된 문서를 검색해요:

date >= "2013-01-01" and date < "2024-01-01"

{% include copy.html %}

not과 필드 이름을 사용해서 "같지 않음" 조건도 쿼리할 수 있어요. 예를 들어 다음과 같아요:

not page_views: 100

{% include copy.html %}

앞선 쿼리는 page_views 필드에 100이 포함되지 않았거나 필드 자체가 존재하지 않는 문서도 반환한다는 점에 유의하세요. page_views 필드가 포함된 문서만 필터링하려면 다음 쿼리를 사용하세요:

page_views:* and not page_views: 100

{% include copy.html %}

불리언 연산자

DQL은 and, or, not 불리언 연산자를 지원해요. DQL은 대소문자를 구분하지 않기 때문에 AND와 and는 같은 의미예요. 예를 들어 다음 쿼리는 두 불리언 절을 논리곱으로 결합한 것이에요:

title: wind and description: epic

{% include copy.html %}

불리언 연산자는 not, and, or 순서의 논리적 우선순위를 따르기 때문에, 다음 예제에서는 title: wind and description: epic이 먼저 평가돼요:

media_type: article or title: wind and description: epic

{% include copy.html %}

평가 순서를 직접 지정하려면 불리언 절을 괄호로 묶으세요. 예를 들어 다음 쿼리에서는 괄호로 묶인 표현식이 먼저 평가돼요:

(media_type: article or title: wind) and description: epic

{% include copy.html %}

필드 접두사는 콜론 바로 뒤에 오는 토큰에만 적용돼요. 예를 들어 다음 쿼리는 title 필드에 windy가 포함된 문서 또는 어떤 필드에든 historical이라는 단어가 포함된 문서를 검색해요:

title: windy or historical

{% include copy.html %}

title 필드에 windy 또는 historical이 포함된 문서를 검색하려면 용어를 괄호로 묶으세요:

title: (windy or historical)

{% include copy.html %}

앞선 쿼리는 title: windy or title: historical과 동일해요.

쿼리를 부정하려면 not 연산자를 사용하세요. 예를 들어 다음 쿼리는 title 필드에 wind라는 단어가 포함되고, media_type이 article이 아니며, description 필드에 epic이 포함되지 않은 문서를 검색해요:

title: wind and not (media_type: article or description: epic)

{% include copy.html %}

쿼리에는 여러 단계의 그룹화를 포함할 수 있어요. 예를 들어 다음과 같아요:

title: ((wind or windy) and not rises)

{% include copy.html %}

객체 필드

객체의 내부 필드를 참조하려면 필드의 도트 경로(dot path)를 나열하세요.

객체가 포함된 문서를 색인하려면 object field type example의 단계를 따르세요. patient 객체의 name 필드를 검색하려면 다음 구문을 사용하세요:

patient.name: john

{% include copy.html %}

중첩 필드

중첩된 객체를 참조하려면 필드의 JSON 경로를 나열하면 돼요.

객체가 포함된 문서를 인덱싱하려면 nested field type example의 단계를 따르면 돼요.

patients 객체의 name 필드를 검색하려면 다음 문법을 사용하면 돼요:

patients: {name: john}

{% include copy.html %}

여러 필드와 일치하는 문서를 가져오려면 모든 필드를 지정하면 돼요. 예를 들어 다음 문서에 status 필드가 추가로 있다고 해볼게요:

{ 
  "status": "Discharged",
  "patients": [ 
    {"name" : "John Doe", "age" : 56, "smoker" : true},
    {"name" : "Mary Major", "age" : 85, "smoker" : false}
  ] 
}

이름이 John인 퇴원 환자를 검색하려면 쿼리에 name과 status를 지정하면 돼요:

patients: {name: john} and status: discharged

{% include copy.html %}

여러 불리언 쿼리와 범위 쿼리를 조합하면 더 정교한 쿼리를 만들 수도 있어요. 예를 들면 다음과 같아요:

patients: {name: john and smoker: true and age < 57} 

{% include copy.html %}

이중으로 중첩된 필드

이중으로 중첩된 필드가 있는 문서를 생각해 볼게요. 이 문서에서는 patients 필드와 names 필드 둘 다 타입이 nested예요:

{
  "patients": [
    {
      "names": [
        { "name": "John Doe", "age": 56, "smoker": true },
        { "name": "Mary Major", "age": 85, "smoker": false}
      ]
    }
  ]
}

patients 객체의 name 필드를 검색하려면 다음 문법을 사용하면 돼요:

patients: {names: {name: john}}

{% include copy.html %}

반면에 patients 필드는 타입이 object이지만 names 필드는 타입이 nested인 문서를 생각해 볼게요:

{
  "patients": 
  {
    "names": [
      { "name": "John Doe", "age": 56, "smoker": true },
      { "name": "Mary Major", "age": 85, "smoker": false}
    ]
  }
}

patients 객체의 name 필드를 검색하려면 다음 문법을 사용하면 돼요:

patients.names: {name: john}

{% include copy.html %}

더 알아보기 (Learn more)