검색 쿼리

검색 쿼리 (Search query)

검색 쿼리는 검색 스펙(search spec)과 일치하는 차원 값들을 반환하는 native 전용 쿼리 타입이에요. 예를 들어 특정 문자열을 포함하는 차원 값을 찾고 싶을 때 써요.

출처: 문서

본문

Apache Druid는 두 가지 쿼리 언어를 지원해요: Druid SQL 과 native 쿼리. 이 문서는 native 언어에서만 사용할 수 있는 쿼리 타입을 설명해요.

검색 쿼리는 검색 스펙과 일치하는 차원 값을 반환해요.

{
  "queryType": "search",
  "dataSource": "sample_datasource",
  "granularity": "day",
  "searchDimensions": [ "dim1", "dim2" ],
  "query": {
    "type": "insensitive_contains",
    "value": "Ke"
  },
  "sort" : {
    "type": "lexicographic"
  },
  "intervals": [ "2013-01-01T00:00:00.000/2013-01-03T00:00:00.000" ]
}

검색 쿼리의 주요 부분은 몇 가지가 있어요:

| 속성 | 설명 | 필수? | | queryType | 이 String은 항상 "search"이어야 해요. Apache Druid가 쿼리를 해석하는 방법을 알아내기 위해 가장 먼저 보는 값이에요. | 예 | | dataSource | 쿼리할 데이터 소스를 정의하는 String 또는 Object. 관계형 데이터베이스의 테이블과 매우 유사해요. 자세한 내용은 DataSource 를 참고하세요. | 예 | | granularity | 쿼리의 세분성을 정의해요. Granularities 참고. | 아니요 (기본값 all) | | filter | Filters 참고. | 아니요 | | limit | Historical 프로세스당 반환할 검색 결과의 최대 개수(int로 파싱됨)를 정의해요. | 아니요 (기본값 1000) | | intervals | ISO-8601 Intervals를 나타내는 JSON Object. 쿼리를 실행할 시간 범위를 정의해요. | 예 | | searchDimensions | 검색을 실행할 차원들. 이것을 제외하면 검색이 모든 차원에 대해 실행돼요. | 아니요 | | virtualColumns | searchDimensions에서 사용할 수 있는 가상 컬럼의 JSON 목록. | 아니요 (기본값 없음) | | query | SearchQuerySpec 참고. | 예 | | sort | 검색 결과를 정렬할 방법을 지정하는 객체. 가능한 타입은 "lexicographic"(기본 정렬), "alphanumeric", "strlen", "numeric" 예요. 자세한 내용은 Sorting Orders 참고. | 아니요 | | context | Context 참고 | 아니요 |

결과 형식은 다음과 같아요:

[
  {
    "timestamp": "2013-01-01T00:00:00.000Z",
    "result": [
      { "dimension": "dim1", "value": "Ke$ha", "count": 3 },
      { "dimension": "dim2", "value": "Ke$haForPresident", "count": 1 }
    ]
  },
  {
    "timestamp": "2013-01-02T00:00:00.000Z",
    "result": [
      { "dimension": "dim1", "value": "SomethingThatContainsKe", "count": 1 },
      { "dimension": "dim2", "value": "SomethingElseThatContainsKe", "count": 2 }
    ]
  }
]

구현 세부사항 (Implementation details)

전략 (Strategies)

검색 쿼리는 두 가지 서로 다른 전략으로 실행될 수 있어요. 기본 전략은 Broker의 "druid.query.search.searchStrategy" 런타임 속성으로 결정돼요. 이 값은 쿼리 context의 "searchStrategy"로 재정의할 수 있어요. context 필드도 속성도 설정되지 않으면 "useIndexes" 전략이 사용돼요.

  • "useIndexes" 전략(기본값)은 먼저 검색 차원을 비트맵 인덱스 지원 여부에 따라 두 그룹으로 분류해요. 그런 다음 비트맵을 지원하는 차원 그룹에는 index-only 실행 계획을, 나머지에는 cursor 기반 실행 계획을 적용해요. index-only 계획은 검색 쿼리 처리에 인덱스만 사용해요. 각 차원에 대해 각 차원 값의 비트맵 인덱스를 읽고, 검색 술어(predicate)를 평가하고, 마지막으로 시간 interval과 필터 술어를 확인해요. cursor 기반 실행 계획은 "cursorOnly" 전략을 참고하세요. index-only 계획은 카디널리티가 큰 검색 차원(즉 검색 차원의 대부분 값이 고유한 경우)에서 성능이 낮아요.
  • "cursorOnly" 전략은 cursor 기반 실행 계획을 생성해요. 이 계획은 queryableIndexSegment에서 행을 읽고 검색 술어를 평가하는 cursor를 만들어요. 일부 필터가 비트맵 인덱스를 지원하면, cursor는 그 필터를 만족하는 행만 읽어 I/O 비용을 절약할 수 있어요. 하지만 선택도(selectivity)가 낮은 필터에서는 느릴 수 있어요.

서버 구성 (Server configuration)

다음 런타임 속성이 적용돼요:

| 속성 | 설명 | 기본값 | | druid.query.search.searchStrategy | 기본 검색 쿼리 전략. | useIndexes |

쿼리 context (Query context)

다음 쿼리 context 파라미터가 적용돼요:

| 속성 | 설명 | | searchStrategy | 이 쿼리에 대한 druid.query.search.searchStrategy 값을 재정의해요. |

SearchQuerySpec

insensitive_contains

차원 값의 어느 부분이든 이 검색 쿼리 스펙에 지정된 값을 대소문자와 무관하게 포함하면 "일치"(match)해요. 문법은:

{
  "type"  : "insensitive_contains",
  "value" : "some_value"
}

fragment

차원 값의 어느 부분이든 이 검색 쿼리 스펙에 지정된 모든 값들을 (기본으로 대소문자와 무관하게) 포함하면 "일치"해요. 문법은:

{
  "type" : "fragment",
  "case_sensitive" : false,
  "values" : ["fragment1", "fragment2"]
}

contains

차원 값의 어느 부분이든 이 검색 쿼리 스펙에 지정된 값이 포함되면 "일치"해요. 문법은:

{
  "type"  : "contains",
  "case_sensitive" : true,
  "value" : "some_value"
}

regex

차원 값의 어느 부분이든 이 검색 쿼리 스펙에 지정된 패턴이 포함되면 "일치"해요. 문법은:

{
  "type"  : "regex",
  "pattern" : "some_pattern"
}

더 알아보기 (Learn more)

  • 정렬 순서 (Sorting orders) — sort 옵션의 정렬 방식을 자세히 알아보세요.
  • Filter — 검색 쿼리를 필터와 함께 사용하는 방법을 살펴보세요.