Краткое руководство. Поиск Управляемый экземпляр Azure для Apache Cassandra с помощью Lucene Index (предварительная версия)
Cassandra Lucene Index, производный от Stratio Cassandra, является подключаемым модулем для Apache Cassandra, который расширяет функциональные возможности индексов для предоставления возможностей полнотекстового поиска и бесплатного многопарарифного, геопространственного и укусампорального поиска. Она достигается с помощью реализации вторичных индексов Cassandra на основе Apache Lucene, где каждый узел кластера индексирует свои собственные данные. В этом кратком руководстве показано, как выполнить поиск в Azure Управляемый экземпляр для Apache Cassandra с помощью Lucene Index.
Внимание
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 Index:
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;
Чтобы получить более последние отфильтрованные результаты, можно использовать параметр сортировки:
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;
Следующие шаги
Из этого краткого руководства вы узнали, как выполнить поиск Управляемый экземпляр Azure для кластера Apache Cassandra с помощью Lucene Search. Теперь можно приступить к работе с кластером: