你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Lucene Index(预览版)在 Azure Managed Instance for Apache Cassandra 中进行搜索

Cassandra Lucene Index 派生自 Stratio Cassandra,是 Apache Cassandra 的插件,可扩展其索引功能,并提供全文搜索功能以及免费的多变量、地理空间和双时态搜索。 它通过基于 Apache Lucene 的 Cassandra 辅助索引实现来完成此功能,其中群集的每个节点会为自己的数据编制索引。 本快速入门演示如何使用 Lucene Index 在 Azure Managed Instance for Apache Cassandra 中进行搜索。

重要

Lucene Index 为公共预览版。 此功能不附带服务级别协议,不建议将其用于生产工作负载。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

警告

Lucene Index 插件的一个限制是跨分区搜索无法仅在索引中执行 - Cassandra 需要将查询发送到每个节点。 这可能会导致跨分区搜索的性能(内存和 CPU 负载)问题,可能会影响稳定状态工作负载。

如果搜索的要求很高,建议部署专用辅助数据中心,仅用于搜索,配备最少的节点数量,每个节点配备大量核心(至少 16 个)。 然后,主要(运营)数据中心中的键空间应配置为将数据复制到辅助(搜索)数据中心。

先决条件

  • 如果没有 Azure 订阅,请在开始之前创建一个免费帐户

  • 部署 Azure Managed Instance for Apache Cassandra 群集。 可以通过门户执行此操作 - 从门户部署群集时,默认情况下将启用 Lucene Index。 如果要将 Lucene Index 添加到现有群集,请在门户“概述”边栏选项卡中单击 Update,选择 Cassandra Lucene Index,然后单击“更新”进行部署。

    更新 Cassandra 群集属性的屏幕截图。

  • CQLSH 连接到你的群集。

使用 Lucene Index 创建数据

  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. 若要获取筛选后最近的 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;
    

后续步骤

在本快速入门中,你了解了如何使用 Lucene Search 在 Azure Managed Instance for Apache Cassandra 群集中进行搜索。 现在你可开始使用该群集了: