通过开源客户端访问并使用搜索索引

云原生多模数据库 Lindorm宽表引擎推出一种新的索引类型,称为搜索索引(SearchIndex)。本文介绍使用开源HBase API和Elasticsearch API访问并使用搜索索引。

背景信息

搜索索引通过融合Lindorm宽表引擎(兼容开源HBase API)和Lindorm搜索引擎(兼容开源Elasticsearch API)对外提供统一易用的访问接口,可以满足丰富的查询需求。标准使用方式是通过Lindorm SQL,为了方便更多的用户,也可以通过开源客户端使用搜索索引,有关搜索索引的具体介绍请参见搜索索引介绍

说明

如果您是通过Lindorm SQL创建的表,请通过SQL API使用搜索索引。

前提条件

  • 已安装Java环境,要求安装JDK 1.8及以上版本。

  • 已将客户端IP添加至Lindorm白名单中,具体操作请参见设置白名单

操作步骤概览

image

操作步骤

使用SQL创建搜索索引(推荐)

对于通过HBase API创建的表,也可以使用Lindorm SQL创建搜索索引。通过此方式创建搜索索引流程更便捷,同时也支持开源客户端访问。

  1. 进入Lindorm Shell访问环境,具体操作请参见通过Lindorm Shell访问宽表引擎

  2. 在Lindorm Shell创建宽表,表名为testTable

    create 'testTable', {NAME => 'f'}
  3. 通过Lindorm SQL映射宽表列。

    ALTER TABLE testTable MAP DYNAMIC COLUMN f:name HSTRING;

    更多数据类型的映射说明,请参见数据类型映射关系

  4. 创建名为idx的搜索索引。

    CREATE INDEX idx USING SEARCH ON testTable (f:name);
  5. 在表testTable中插入一条数据。

    put 'testTable', 'row1', 'f:name', 'foo'
    说明

    创建的搜索索引变为ACTIVE状态后,实时写入宽表中的数据将自动同步到索引表中。索引状态的查看方法,请参见SHOW INDEX。对于宽表中的历史数据,需要使用ALTER INDEX语句重新构建。例如:ALTER INDEX idx ON test REBUILD;,其中idx为宽表搜索索引的索引名。详细的语法说明,请参见ALTER INDEX

  6. 查询索引数据。

    1. 通过搜索引擎查询索引数据,获取搜索索引表的主键ID。

      说明
      • 搜索引擎索引表的名称由此规则拼接而成:<命名空间名称>.<表名称>.<索引名称>

      • 搜索索引表的字段名称由以下规则拼接而成:

        • 对应宽表的列族为f时,索引表字段名称为列名。例如,f:name对应name

        • 对应宽表列的列族不为f时,索引表字段名为<列族名>_<列名>。例如f1:name对应f1_name

      GET /default.testTable.idx/_search
      {
        "size": 10,
        "query": {
          "match": {
            "name": "foo"
          }
        }
      }

      返回结果:

      {
        "took" : 4,
        "timed_out" : false,
        "_shards" : {
          "total" : 1,
          "successful" : 1,
          "skipped" : 0,
          "failed" : 0
        },
        "hits" : {
          "total" : {
            "value" : 1,
            "relation" : "eq"
          },
          "max_score" : 1.0,
          "hits" : [
            {
              "_index" : "default.testTable.idx",
              "_id" : "726f7731",
              "_score" : 1.0,
              "_source" : {
                "update_version_l" : 1720072175536
              }
            }
          ]
        }
      }

      从返回结果中获取搜索索引表的主键ID(_id)。

    2. 进入Lindorm Shell环境,执行以下命令查询宽表数据。通过SQL方式创建的搜索索引,宽表主键ID将会以HEX编码格式映射为搜索索引表主键,因此需要以HEX编码格式查询,具体请参考rowkeyFormatterType的参数说明

      get 'testTable', "\x72\x6f\x77\x31"

      返回结果:

      COLUMN                                         CELL
       f:name                                        timestamp=1644462597661, value=foo
      1 row(s)
      Took 0.0942 seconds

使用Lindorm Shell创建搜索索引

  1. 进入Lindorm Shell访问环境,具体操作请参见通过Lindorm Shell访问宽表引擎

  2. 在Lindorm Shell创建宽表,表名为testTable

    create 'testTable', {NAME => 'f'}
  3. 在搜索引擎中创建索引表,索引表的表名为democollection。如何创建请参见连接指南

    说明

    在搜索引擎中创建索引表时,若无获取具体字段值的需求,可将_source配置为false,以减少不必要的资源占用。

  4. 映射宽表列和索引列。例如将表testTable中的f:name(列族为f,列名为name)这一列映射到索引表democollectionname_s这一列。

    1. 在HBase Shell解压文件的bin目录中创建JSON文件(文件名为schema),将以下代码复制至JSON文件中。

      {
        "sourceNamespace": "default",
        "sourceTable": "testTable",
        "targetIndexName": "democollection",
        "indexType": "ES",
        "rowkeyFormatterType": "STRING",
        "fields": [
          {
            "source": "f:name",
            "targetField": "name_s",
            "type": "STRING"
          }
        ]
      }
      说明
      • 请确保列映射中的每一列在搜索引擎中均已显式定义,且列名、数据类型与列映射的一致。

      • JSON文件中的参数说明请参见配置列映射

    2. 进入Lindorm Shell环境,执行以下命令完成宽表列和索引表列的映射关系。

      alter_external_index 'testTable', 'schema.json'
      说明

      关于宽表列和索引表列的映射管理操作请参见管理列映射

  5. 在表testTable中写入一条数据。宽表和索引表的列映射关系配置完成后,实时写入宽表中的数据将自动同步到索引表中。对于宽表中的历史数据,需要手动执行全量构建索引才可以完成数据同步,具体操作请参见构建全量数据索引

    put 'testTable', 'row1', 'f:name', 'foo'
  6. 查询索引数据。

    1. 通过搜索引擎查询索引数据,获取搜索索引表的主键ID。

      GET /democollection/_search
      {
        "size": 10,
        "query": {
          "match": {
            "name_s": "foo"
          }
        }
      }

      返回结果:

      {
        "took" : 4,
        "timed_out" : false,
        "_shards" : {
          "total" : 1,
          "successful" : 1,
          "skipped" : 0,
          "failed" : 0
        },
        "hits" : {
          "total" : {
            "value" : 1,
            "relation" : "eq"
          },
          "max_score" : 1.0,
          "hits" : [
            {
              "_index" : "democollection",
              "_id" : "row1",
              "_score" : 1.0,
              "_source" : {
                "update_version_l" : 1720072175536
              }
            }
          ]
        }
      }

      从返回结果中获取搜索索引表的主键ID(_id)。

    2. 根据列映射中定义的rowkeyFormatterType,使用对应方法将搜索索引表的主键ID转换为宽表主键row1,具体操作请参见rowkeyFormatterType的参数说明。本示例使用STRING映射格式,搜索索引表的主键ID和宽表主键一致。

    3. 进入Lindorm Shell环境,执行以下命令查询宽表数据。

      get 'testTable','row1'

      返回内容如下:

      COLUMN                                         CELL
       f:name                                        timestamp=1644462597661, value=foo
      1 row(s)
      Took 0.0942 seconds
  7. 通过LTS页面查看实时数据的同步任务状态。宽表和索引表的列映射关系配置完成后,实时写入宽表中的数据将自动同步到索引表中。

    1. 登录LTS操作页面。在Lindorm控制台上单击目标实例ID,左侧导航栏选择宽表引擎 > 搜索索引(SearchIndex),在数据同步管理 UI后单击ClusterManager公网ClusterManager专有网络

    2. 左侧导航栏选择Lindorm Search > 实时同步

      查看任务状态

      说明

      实时数据同步的延迟指标可以通过云监控控制台设置,最大任务延迟的报警阈值可以设置为600000毫秒,具体操作请参见云产品监控