본문으로 건너뛰기

엘라산드라 공홈 번역 - Search

Search through CQL섹션을 번역했다. 두루두루 읽자


Search through CQL

카산드라 CQL 드라이버를 통해 Elasticsearch 쿼리를 실행하는 것은 여러 가지 이점을 제공합니다:

  • 드라이버가 클러스터를 인식하고 로드 밸런싱을 수행하기 때문에 HTTP 로드 밸런서가 필요하지 않습니다.
  • CQL 및 Elasticsearch 요청에 동일한 데이터 액세스 객체(DAO)를 사용하여 응용 프로그램 개발을 단순화할 수 있습니다.
  • 카산드라 인증 및 TLS 암호화와 통합된 보안을 얻을 수 있습니다.
  • CQL 페이징을 통해 Elasticsearch 스크롤링을 관리할 수 있습니다.

Configuration

CQL을 통해 Elasticsearch 쿼리를 활성화하려면 다음 단계를 따르세요:

  • cassandra-env.sh 파일에서 시스템 속성 cassandra.custom_query_handler_class를 사용하여 카산드라 CQL 쿼리 핸들러를 설정하고 노드를 다시 시작하세요:
JVM_OPTS="$JVM_OPTS -Dcassandra.custom_query_handler_class=org.elassandra.index.ElasticQueryHandler"
  • 카산드라 테이블에 더미 컬럼 es_query를 추가하세요.
  • 특정 옵션(대상 인덱스 이름과 같은)을 지정해야 하는 경우 카산드라 테이블에 더미 컬럼 es_options를 추가하세요.
ALTER TABLE twitter.tweet ADD es_query text;
ALTER TABLE twitter.tweet ADD es_options text;

Search request through CQL

그런 다음에는 다음과 같이 CQL SELECT 요청으로 직접 연결된 Elasticsearch 인덱스를 쿼리할 수 있습니다. (문서의 _type은 카산드라 테이블 이름입니다).

cassandra@cqlsh> SELECT "_id",foo FROM twitter.tweet WHERE es_query='{"query":{"query_string":{"query":"bar2*"}}}';

_id | foo
-----+-------
2 | bar2
20 | bar20
22 | bar22
23 | bar23
24 | bar24
28 | bar28
21 | bar21
25 | bar25
26 | bar26
27 | bar27

(10 rows)

대상 인덱스가 기본 키스페이스와 동일한 이름을 갖지 않는 경우, es_options에서 대상 인덱스 이름을 지정할 수 있습니다. 이때, ALLOW FILTERING을 반드시 붙여야 합니다.
예를 들어, 다음과 같이 es_options 컬럼을 사용하여 대상 인덱스 이름을 지정할 수 있습니다.

cassandra@cqlsh> SELECT "_id",foo FROM twitter.tweet WHERE es_query='{"query":{"query_string":{"query":"bar2*"}}}' AND es_options='indices=twitter*' ALLOW FILTERING;

Paging

기본적으로, 카산드라 드라이버 페이징이 활성화되면 CQL 쿼리 핸들러는 많은 결과를 검색하기 위해 스크롤 커서를 엽니다(또는 모든 결과를 검색할 수도 있음). 스크롤 컨텍스트는 마지막 페이지를 가져올 때 자동으로 해제됩니다. 기본 스크롤 타임아웃은 60초입니다.

처음 N개의 결과만 필요한 경우, 다음과 같이 CQL LIMIT 절을 사용하세요. 요청된 LIMIT이 CQL 페이지 크기보다 작을 경우(기본값은 5000이며, CQL 페이징 참조), CQL 쿼리 핸들러는 스크롤 커서를 열지 않고, 단지 Elasticsearch 쿼리 크기를 설정합니다.

cassandra@cqlsh> SELECT "_id",foo FROM twitter.tweet WHERE es_query='{"query":{"query_string":{"query":"bar2*"}}}' LIMIT 3;

_id | foo
-----+-------
2 | bar2
20 | bar20
22 | bar22

(3 rows)

CQL 페이징이 비활성화되고 LIMIT 절이 없는 경우, CQL 쿼리 핸들러는 Elasticsearch 쿼리 크기를 10000으로 제한하여 검색 요청을 실행합니다. 이는 기본적으로 index.max_result_window (동적 인덱스 설정에 대한 자세한 내용은 https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html#dynamic-index-settings를 참조하세요)

Routing

WHERE 절에 모든 파티션 키 열이 설정된 경우, Elasticsearch 쿼리는 데이터를 호스팅하는 노드로 직접 전송됩니다(팬아웃 없음).

cassandra@cqlsh> SELECT "_id", foo FROM twitter.tweet WHERE es_query='{"query":{"query_string":{"query":"bar2*"}}}' AND "_id"='2';

_id | foo
-----+------
2 | bar2

(1 rows)

CQL Functions

Cassandra 함수와 사용자 정의 함수는 CQL 프로젝션 절에서 사용할 수 있습니다.

cassandra@cqlsh> SELECT "_id",foo,token("_id"),writetime(foo) FROM twitter.tweet WHERE es_query='{"query":{"query_string":{"query":"bar2*"}}}';

_id | foo | system.token(_id) | writetime(foo)
-----+-------+----------------------+------------------
2 | bar2 | 5293579765126103566 | 1509275059354000
20 | bar20 | 4866192165766252016 | 1509275059572000
22 | bar22 | 5315788262387249245 | 1509275059591000
23 | bar23 | 5502885531913083742 | 1509275059600000
24 | bar24 | 5568379873904613205 | 1509275059614000
28 | bar28 | 3168262793124788288 | 1509275059663000
21 | bar21 | -3201810799627846645 | 1509275059580000
25 | bar25 | 2509205981756244107 | 1509275059625000
26 | bar26 | -6132418777949225301 | 1509275059633000
27 | bar27 | 9060526884622895268 | 1509275059645000

(10 rows)

Elasticsearch aggregations through CQL

Elassandra는 Elasticsearch 집계를 일반 CQL 문에서만 지원합니다. 이 경우:

  • 반환된 열은 집계 이름으로 지정됩니다.
  • CQL 함수는 지원되지 않습니다.
  • CQL 프로젝션 절, LIMIT 및 페이지네이션은 무시됩니다. 이는 또한 집계 결과가 사용 가능한 메모리에 맞아야 함을 의미합니다.
cassandra@cqlsh> SELECT * FROM twitter2.doc WHERE es_query='{"aggs":{"sales_per_month":{"date_histogram":{"field":"post_date","interval":"day"},"aggs":{"sales":{"sum":{"field":"price"}}}}}}';

sales_per_month.key | sales_per_month.count | sales_per_month.sales.sum
---------------------------------+-----------------------+---------------------------
2017-10-04 00:00:00.000000+0000 | 3 | 30
2017-10-05 00:00:00.000000+0000 | 1 | 10
2017-10-06 00:00:00.000000+0000 | 1 | 10
2017-10-07 00:00:00.000000+0000 | 3 | 30

(4 rows)

여러 개의 동일 레벨 집계를 요청할 때 결과는 펼쳐진(flattened) 형태로 제공됩니다. 다음 예제에서는 sales_per_month와 sum_monthly_sales라는 두 개의 최상위 집계가 있습니다.

cassandra@cqlsh> SELECT * FROM twitter2.doc WHERE es_query='{"size":0,
"aggs":{"sales_per_month":{"date_histogram":{"field":"post_date","interval":"day"},"aggs":{"sales":{"sum":{"field":"price"}}}},
"sum_monthly_sales":{"sum_bucket":{"buckets_path":"sales_per_month>sales"}}}}';

sales_per_month.key | sales_per_month.count | sales_per_month.sales.sum | sum_monthly_sales.value

---------------------------------+-----------------------+---------------------------+-------------------------
2017-10-04 00:00:00.000000+0000 | 3 | 30 | null
2017-10-05 00:00:00.000000+0000 | 1 | 10 | null
2017-10-06 00:00:00.000000+0000 | 1 | 10 | null
2017-10-07 00:00:00.000000+0000 | 3 | 30 | null
null | null | null | 80

(5 rows)

집계 유형이 stats와 같이 하나 이상의 값을 반환하는 경우, es_options에서 json 출력을 요청해야 합니다.

SELECT * FROM twitter2.doc WHERE es_query='{"size": 0, "aggs": {"sales": {"stats": {"field": "price"}}}}' AND es_options='indices=twitter2;json=true';

Elassandra는 CQL에서 다음과 같은 집계 유형만 지원합니다:

  • Term 집계
  • Histogram 집계
  • Date Histogram 집계
  • Percentiles 집계
  • Sum 집계
  • Avg 집계
  • Min 집계
  • Max 집계
  • Stats 집계