검색 쿼리
검색 쿼리 (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 — 검색 쿼리를 필터와 함께 사용하는 방법을 살펴보세요.