Поделиться через


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

    Снимок экрана: свойства кластера 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 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"}
             }
          }'
       };
    
  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 более релевантных твитов, где поле текста содержит фразу "Щелкните мою ссылку" в определенном диапазоне дат:

        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. Чтобы получить более последние отфильтрованные результаты, можно использовать параметр сортировки:

        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;
    

Следующие шаги

Из этого краткого руководства вы узнали, как выполнить поиск Управляемый экземпляр Azure для кластера Apache Cassandra с помощью Lucene Search. Теперь можно приступить к работе с кластером: