Краткое руководство. Поиск Управляемый экземпляр 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и щелкните Обновить для развертывания.

    Снимок экрана: обновление свойств кластера Cassandra.

  • Подключитесь к кластеру из CQLSH.

Создание данных с помощью индекса Lucene

  1. В командном 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
       );
    
  2. Теперь создайте пользовательский вторичный индекс в таблице с помощью индекса 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"}
             }
          }'
       };
    
  3. Вставьте следующие примеры твитов:

        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);
    

Управление согласованностью чтения

  1. Созданный ранее индекс будет индексировать все столбцы в таблице с указанными типами, а индекс чтения, используемый для поиска, будет обновляться один раз в секунду. Кроме того, можно явно обновить все сегменты индекса с помощью пустого поиска с согласованностью ALL:

        CONSISTENCY ALL
        SELECT * FROM tweets WHERE expr(tweets_index, '{refresh:true}');
        CONSISTENCY QUORUM
    
  2. Теперь можно искать твиты в определенном диапазоне дат:

        SELECT * FROM tweets WHERE expr(tweets_index, '{filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"}}');
    
  3. Этот поиск также можно выполнить путем принудительного явного обновления задействованных сегментов индекса:

        SELECT * FROM tweets WHERE expr(tweets_index, '{
           filter: {type: "range", field: "time", lower: "2023/03/01", upper: "2023/05/01"},
           refresh: true
        }') limit 100;
    

Поиск данных

  1. Чтобы найти 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;
    
  2. Чтобы уточнить поиск, чтобы получить только твиты, написанные пользователями, имена которых начинаются с "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;
    
  3. Чтобы получить 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;
    
  4. Предыдущий поиск можно ограничить твитами, созданными близко к географическому расположению:

        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;
    
  5. Также можно отсортировать результаты по расстоянию до географического расположения:

        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. Теперь можно приступить к работе с кластером: