创建索引表

Ganos内置了多个空间索引,用户只需在前端输入时空数据,并指定要建立的索引即可,不用再关心HBase的KV如何设计与构建,使用较为方便。因此,在数据写入之前,需要先定义好索引表结构。

Ganos目前支持五类索引,适应于不同的查询场景。这些索引可以同时存在,也可以根据需求只创建某个索引(如业务场景中只有周边范围查询,那么就只需要创建Z2索引,而不用创建其他索引)。

ID索引

适应于根据空间对象ID(称为FID)查询的场景,要求每个空间对象的FID必须唯一。

Z2/XZ2索引

适应于空间查询,如地理围栏判断、周边范围查询等;其中Z2是用于「点」对象;XZ2用于「线」、「面」对象。

Z3/XZ3/XZ2T索引

适应于时空查询,如某个空间范围以及时间段内的历史轨迹等;其中Z3是用于「点」对象;XZ3和XZ2T用于「线」、「面」对象,对于轨迹线模型查询,XZ2T索引对查询效率提升效果更佳。

XYZ索引

适应于含有经度、纬度、高程信息的三维索引,目前仅用于为「点」对象构建三维索引。

属性索引

适应于根据其他属性查询的场景。

建立索引的步骤

建立索引过程中,主要包含两个步骤:

  1. 定义空间/时空数据类型,即SimpleFeatureType 。

    1. 类型schema名称,可以认为是索引表的别名。

    2. schema具体内容,包含了属性,空间对象(Geometry)以及时间等列的定义。

    3. 其他自定义信息,包括:

      1. 使用的压缩方式。

      2. 是否使用TWKB格式。

      3. 为某一列建立索引。

  2. 根据定义好的空间/时空数据类型创建具体的对象。

创建索引示例

如前所述,Ganos的索引可以同时存在,也可以根据需求只创建某个索引(如业务场景中只有周边范围查询,那么就只需要创建Z2索引,而不用创建其他索引)。默认情况下是建立所有的索引,这样对所有的查询场景来说都能提供较高的性能,但会占用较多的存储空间。为了节省空间存储,可以根据查询场景选择合适的索引。Ganos内置了特定的Hints,用来在定义SimpleFeatureType的时候指定对应的索引,语法如下:

// sft为SimpleFeatureType的一个实例对象
sft.getUserData().put("geomesa.indices.enabled", "{index_name}:{col1}:{col2}:...,{index_name}:{col}");
  • index_name取下面常量之一:id, attr, z2, z3, xz2, xz3, xyz。

  • col为SimpleFeatureType中定义的列。

  • 可以创建多个index,每个index之间用分割。

  • 可以将多个列添加到同一个索引中,索引和每个列之间用分割。

下面这个示例中,一共创建了z3和attr两个索引,其中start列+dtg列为z3索引;end列+dtg列为z3索引;name列和dtg列为attr索引。

sft.getUserData().put("geomesa.indices.enabled", "z3:start:dtg,z3:end:dtg,attr:name:dtg");

时空二级索引

Lindorm Ganos利用Lindorm原生二级索引实现时空二级索引能力。常规二级索引表建立在主表的某个属性列上,但对序列化后的时空属性列直接建立二级索引是没有实际意义的。因此,需要先在主表上加入时空编码列(该列存储时空属性的空间填充曲线编码值),再对索引列建立二级索引。二级索引存储结构示例:

二级索引

该示例中对以ID为RowKey的主表创建了Z3时空索引列,并在时空索引列上建立二级索引表。默认二级索引表中没有冗余列。冗余列支持待后续开放。

时空二级索引创建示例
在创建主表同时指定需要创建的时空二级索引类型

对已定义的SimpleFeatureType(示例中的sft)指定userData参数

// sft为SimpleFeatureType的一个实例对象
sft.getUserData().put("geomesa.secondary.enabled","true");
sft.getUserData().put("geomesa.primary.index","id");
sft.getUserData().put("geomesa.indices.enabled","id,z3");

调用createSchema创建表后,会生成如上图结构所示的ID主表和z3二级索引表

在已经存在的主表上建立二级索引

调用LindormDataStore.createIndex方法,在已创建且"geomesa.secondary.enabled"参数为true的主表上,创建二级索引

String index = "attr:dtg";
lindormDS.createIndex(schemaName, index);

注意:目前不支持创建新索引表的同时同步历史数据