Stratio Cassandra에서 파생되는 Cassandra Lucene Index는 Apache Cassandra의 플러그 인입니다. Lucene Index는 인덱스 기능을 확장하여 전체 텍스트 검색 기능과 다변량, 지리공간 및 복시점 검색을 제공합니다. 클러스터의 각 노드가 자체 데이터를 인덱싱하는 Cassandra 보조 인덱스의 Apache Lucene 기반 구현을 통해 구현됩니다. 이 빠른 시작에서는 Lucene Index를 사용하여 Apache Cassandra용 Azure Managed Instance를 검색하는 방법을 보여 줍니다.
중요
Lucene 인덱스는 공개 미리 보기로 제공됩니다. 해당 기능은 별도의 서비스 수준 규약 없이 사용할 수 있습니다. 프로덕션 워크로드에는 권장하지 않습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.
Lucene 인덱스 플러그 인은 인덱스에서만 파티션 간 검색을 실행할 수 없습니다. Cassandra는 각 노드에 쿼리를 보내야 합니다. 이러한 제한으로 인해 안정적인 상태 워크로드에 영향을 줄 수 있는 파티션 간 검색의 성능(메모리 및 CPU 로드)에 문제가 발생할 수 있습니다.
검색 요구 사항이 중요한 경우 검색에만 사용할 전용 보조 데이터 센터를 배포하는 것이 좋습니다. 최소 개수의 노드에는 각각 높은 수의 코어(최소 16개)가 있어야 합니다. 그런 다음 기본(운영) 데이터 센터의 키스페이스를 구성하여 보조(검색) 데이터 센터에 데이터를 복제해야 합니다.
필수 구성 요소
Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Azure Managed Instance for Apache Cassandra 클러스터를 배포합니다. Azure Portal을 통해 이 단계를 수행할 수 있습니다. 클러스터가 포털에서 배포될 때 Lucene 인덱스는 기본적으로 사용하도록 설정됩니다. 기존 클러스터에 Lucene 인덱스를 추가하려면 포털 개요 창에서 업데이트를 선택합니다. Cassandra Lucene 인덱스를 선택한 다음 업데이트를 선택하여 배포합니다.
CQLSH(Cassandra Query Language Shell)에서 클러스터에 연결합니다.
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;
데이터 검색
관련성이 더 높고 필드에 특정 날짜 범위 내의
body
구Click my link
가 포함된 상위 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 Index를 사용하여 Apache Cassandra 클러스터용 Azure Managed Instance를 검색하는 방법을 알아보았습니다. 이제 클러스터 사용을 시작할 수 있습니다.