Краткое руководство. Поиск Управляемый экземпляр Azure для Apache Cassandra с помощью индекса Lucene (предварительная версия)
Индекс Cassandra Lucene, производный от Stratio Cassandra, — это подключаемый модуль для Apache Cassandra, расширяющий функциональные возможности индексов, предоставляющий возможности полнотекстового поиска и бесплатный многомерный, геопространственный и укусимпоральный поиск. Это достигается за счет реализации вторичных индексов Cassandra на основе Apache Lucene, где каждый узел кластера индексирует собственные данные. В этом кратком руководстве показано, как выполнять поиск в Azure Управляемый экземпляр для Apache Cassandra с помощью индекса Lucene.
Важно!
Lucene Index находится в общедоступной предварительной версии. Эта функция предоставляется без соглашения об уровне обслуживания и не рекомендуется для использования в рабочей среде. Дополнительные сведения см. в статье Дополнительные условия использования предварительных выпусков Microsoft Azure.
Предупреждение
Ограничение подключаемого модуля индекса Lucene заключается в том, что поиск между секциями не может выполняться исключительно в индексе . Cassandra необходимо отправить запрос на каждый узел. Это может привести к проблемам с производительностью (памятью и загрузкой ЦП) для поиска между секциями, которые могут повлиять на рабочие нагрузки с устойчивым состоянием.
Если требования к поиску являются значительными, рекомендуется развернуть выделенный дополнительный центр обработки данных, который будет использоваться только для поиска, с минимальным количеством узлов, каждый из которых имеет большое количество ядер (не менее 16). Затем пространства ключей в основном (рабочем) центре обработки данных должны быть настроены для репликации данных в дополнительный (поисковый) центр обработки данных.
Предварительные требования
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.
Развертывание Управляемый экземпляр Azure для кластера 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 наиболее релевантных твитов, где поле body содержит фразу "Щелкните мою ссылку" в определенном диапазоне дат:
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;
Дальнейшие действия
Из этого краткого руководства вы узнали, как выполнять поиск в кластере Apache Cassandra в Управляемый экземпляр Azure с помощью Поиска Lucene. Теперь можно приступить к работе с кластером: