빠른 시작: Lucene 인덱스(미리 보기)를 사용하여 Azure Managed Instance for Apache Cassandra 검색
Stratio Cassandra에서 파생된 Cassandra Lucene 인덱스는 전체 텍스트 검색 기능과 무료 다변량, 지리 공간 및 bitemporal 검색을 제공하기 위해 인덱스 기능을 확장하는 Apache Cassandra용 플러그 인입니다. 클러스터의 각 노드가 자체 데이터를 인덱싱하는 Cassandra 보조 인덱스의 Apache Lucene 기반 구현을 통해 구현됩니다. 이 빠른 시작에서는 Lucene 인덱스를 사용하여 Azure Managed Instance for Apache Cassandra를 검색하는 방법을 보여 줍니다.
Important
Lucene 인덱스는 공개 미리 보기로 제공됩니다. 해당 기능은 별도의 Service Level Agreement(서비스 수준 규약) 없이 제공되며, 프로덕션 작업에는 사용하지 않는 것이 좋습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.
Warning
Lucene 인덱스 플러그 인의 제한 사항은 파티션 간 검색을 인덱스에서만 실행할 수 없다는 것입니다. Cassandra는 쿼리를 각 노드로 보내야 합니다. 이로 인해 안정적인 상태 워크로드에 영향을 줄 수 있는 파티션 간 검색의 성능(메모리 및 CPU 로드)에 문제가 발생할 수 있습니다.
검색 요구 사항이 중요한 경우에는 최소한의 노드 수와 많은 수의 코어(최소 16개)를 갖춘 검색 전용 보조 데이터 센터를 배포하는 것이 좋습니다. 그런 다음, 기본(운영) 데이터 센터의 키스페이스를 구성하여 보조(검색) 데이터 센터에 데이터를 복제해야 합니다.
필수 조건
Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Azure Managed Instance for Apache Cassandra 클러스터를 배포합니다. 포털을 통해 이 작업을 수행할 수 있습니다. 클러스터가 포털에서 배포될 때 Lucene 인덱스는 기본적으로 사용하도록 설정됩니다. 기존 클러스터에 Lucene 인덱스를 추가하려면 포털 개요 블레이드에서
Update
를 클릭하고Cassandra Lucene Index
를 선택한 다음, 업데이트를 클릭하여 배포합니다.CQLSH에서 클러스터에 연결합니다.
Lucene 인덱스로 데이터 만들기
CQLSH
명령 창에서 아래와 같이 키스페이스와 테이블을 만듭니다.CREATE KEYSPACE demo WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'datacenter-1': 3}; USE demo; CREATE TABLE tweets ( id INT PRIMARY KEY, user TEXT, body TEXT, time TIMESTAMP, latitude FLOAT, longitude FLOAT );
이제 Lucene 인덱스를 사용하여 테이블에 사용자 지정 보조 인덱스를 만듭니다.
CREATE CUSTOM INDEX tweets_index ON tweets () USING 'com.stratio.cassandra.lucene.Index' WITH OPTIONS = { 'refresh_seconds': '1', 'schema': '{ fields: { id: {type: "integer"}, user: {type: "string"}, body: {type: "text", analyzer: "english"}, time: {type: "date", pattern: "yyyy/MM/dd"}, place: {type: "geo_point", latitude: "latitude", longitude: "longitude"} } }' };
다음 샘플 트윗을 삽입합니다.
INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (1,'theo','Make money fast, 5 easy tips', '2023-04-01T11:21:59.001+0000', 0.0, 0.0); INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (2,'theo','Click my link, like my stuff!', '2023-04-01T11:21:59.001+0000', 0.0, 0.0); INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (3,'quetzal','Click my link, like my stuff!', '2023-04-02T11:21:59.001+0000', 0.0, 0.0); INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (4,'quetzal','Click my link, like my stuff!', '2023-04-01T11:21:59.001+0000', 40.3930, -3.7328); INSERT INTO tweets (id,user,body,time,latitude,longitude) VALUES (5,'quetzal','Click my link, like my stuff!', '2023-04-01T11:21:59.001+0000', 40.3930, -3.7329);
읽기 일관성 제어
이전에 만든 인덱스는 지정된 형식을 사용하여 테이블의 모든 열을 인덱싱하며, 검색에 사용되는 읽기 인덱스는 초당 한 번 새로 고쳐집니다. 또는 일관성이 ALL인 빈 검색을 사용하여 모든 인덱스 분할된 데이터베이스를 명시적으로 새로 고칠 수 있습니다.
CONSISTENCY ALL SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}'); CONSISTENCY QUORUM
이제 특정 날짜 범위 내의 트윗을 검색할 수 있습니다.
SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
관련 인덱스 분할된 데이터베이스의 명시적 새로 고침을 강제로 수행하여 이 검색을 수행할 수도 있습니다.
SELECT * FROM tweets WHERE expr(tweets_index, '{ filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}, refresh: true }') limit 100;
데이터 검색
특정 날짜 범위 내의 본문 필드에 "내 링크를 클릭하세요"라는 문구가 포함된 상위 100개의 관련 트윗을 검색하려면 다음을 수행합니다.
SELECT * FROM tweets WHERE expr(tweets_index, '{ filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}, query: {type: "phrase", field: "body", value: "Click my link", slop: 1} }') LIMIT 100;
이름이 "q"로 시작하는 사용자가 작성한 트윗만 가져오도록 검색을 구체화하려면 다음을 수행합니다.
SELECT * FROM tweets WHERE expr(tweets_index, '{ filter: [ {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}, {type: "prefix", field: "user", value: "q"} ], query: {type: "phrase", field: "body", value: "Click my link", slop: 1} }') LIMIT 100;
최근에 필터링된 100개 결과를 얻으려면 정렬 옵션을 사용하면 됩니다.
SELECT * FROM tweets WHERE expr(tweets_index, '{ filter: [ {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}, {type: "prefix", field: "user", value: "q"} ], query: {type: "phrase", field: "body", value: "Click my link", slop: 1}, sort: {field: "time", reverse: true} }') limit 100;
이전 검색은 지리적 위치에 가깝게 만든 트윗으로 제한될 수 있습니다.
SELECT * FROM tweets WHERE expr(tweets_index, '{ filter: [ {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}, {type: "prefix", field: "user", value: "q"}, {type: "geo_distance", field: "place", latitude: 40.3930, longitude: -3.7328, max_distance: "1km"} ], query: {type: "phrase", field: "body", value: "Click my link", slop: 1}, sort: {field: "time", reverse: true} }') limit 100;
지리적 위치까지의 거리를 기준으로 결과를 정렬할 수도 있습니다.
SELECT * FROM tweets WHERE expr(tweets_index, '{ filter: [ {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}, {type: "prefix", field: "user", value: "q"}, {type: "geo_distance", field: "place", latitude: 40.3930, longitude: -3.7328, max_distance: "1km"} ], query: {type: "phrase", field: "body", value: "Click my link", slop: 1}, sort: [ {field: "time", reverse: true}, {field: "place", type: "geo_distance", latitude: 40.3930, longitude: -3.7328} ] }') limit 100;
다음 단계
이 빠른 시작에서는 Lucene Search를 사용하여 Azure Managed Instance for Apache Cassandra 클러스터를 검색하는 방법을 알아보았습니다. 이제 클러스터 사용을 시작할 수 있습니다.