使用CreateSearchIndex接口在数据表上创建一个多元索引。一个数据表可以创建多个多元索引。 创建多元索引时,您需要将要查询的字段添加到多元索引中,您还可以配置多元索引的数据生命周期、预排序等高级选项。
已初始化Client。具体操作,请参见 初始化OTSClient 。
已创建数据表,且数据表的最大版本数(max Versions)必须为1,数据生命周期(Time to Live)必须满足如下条件中的任意一个。具体操作,请参见 创建数据表 。
数据表的数据生命周期为-1(数据永不过期)。
数据表的数据生命周期不为-1时,数据表为禁止更新状态(即 是否允许更新 为 否 )。
创建多元索引时,多元索引中字段的数据类型必须与数据表中字段的数据类型相匹配。更多信息,请参见 数据类型映射 。
如果要修改为指定数据生命周期(即取值不为-1),则您必须禁用数据表的UpdateRow更新写入功能。同时多元索引的TTL值必须小于或等于数据表的TTL值。更多信息,请参见 生命周期管理 。
public class CreateSearchIndexRequest implements Request { /**数据表名称。*/ private String tableName; /** 多元索引名称。*/ private String indexName; /**多元索引的schema结构。*/ private IndexSchema indexSchema; * 一般情况下,不需要设置本字段。 * 仅在动态修改多元索引schema的场景下,通过setter方法进行设置本字段,作为重建索引的源索引名字。 private String sourceIndexName; /**索引数据的TTL时间,单位为秒。在多元索引创建后,该配置项可通过调用UpdateSearchIndex接口动态更改。*/ private Integer timeToLive; public class IndexSchema implements Jsonizable { /** 关于某个index的设置。*/ private IndexSetting indexSetting; /**该index的所有字段的设置。*/ private List<FieldSchema> fieldSchemas; /**自定义索引的预排序方式。*/ private Sort indexSort; }
创建多元索引时,需要指定数据表名称(tableName)、多元索引名称(indexName)和索引的结构信息(indexSchema)和timeToLive(数据生命周期),其中indexSchema包含fieldSchemas(Index的所有字段的设置)、indexSetting(索引设置)和indexSort(索引预排序设置)。详细参数说明请参见下表。
参数
说明
tableName
数据表名称。
indexName
多元索引名称。
fieldSchemas
fieldSchema的列表,每个fieldSchema包含如下内容:
fieldName(必选):创建多元索引的字段名,即列名,类型为String。
多元索引中的字段可以是主键列或者属性列。
fieldType(必选):字段类型,类型为FieldType.XXX。更多信息,请参见 数据类型映射 。
如果要进行多层逻辑关系的数据存储和查询,您可以使用嵌套类型存储数据。更多信息,请参见 数组和嵌套类型 。
如果要存储和查询JSON格式数据,您可以在数据表中使用字符串方式存储JSON数据,然后通过多元索引中的数组和嵌套类型实现JSON数据的灵活查询。更多信息,请参见 数组和嵌套类型 。
如果应用中需要地理位置相关查询,您可以使用Geo-point字段类型存储数据。
enableSortAndAgg(可选):是否开启排序与统计聚合功能,类型为Boolean。
只有enableSortAndAgg设置为true的字段才能进行排序。关于排序的更多信息,请参见 排序和翻页 。
array(可选):是否为数组,类型为Boolean。
如果设置为true,则表示该列是一个数组,在写入时,必须按照JSON数组格式写入,例如["a","b","c"]。
由于Nested类型是一个数组,当fieldType为Nested类型时,无需设置此参数。
analyzer(可选):分词器类型。当字段类型为Text时,可以设置此参数;如果不设置,则默认分词器类型为单字分词。关于分词的更多信息,请参见 分词 。
isVirtualField(可选):该字段是否为虚拟列,类型为Boolean类型,默认值为false。只有使用虚拟列时,才需要设置此参数。关于虚拟列的更多信息,请参见 虚拟列 。
sourceFieldName(可选):数据表中的字段名称,类型为String。当设置isVirtualField为true时,必须设置此参数。
dateFormats(可选):日期的格式,类型为String。当字段类型为Date时,必须设置此参数。更多信息,请参见 日期数据类型 。
indexSetting
索引设置,包含routingFields设置。
routingFields(可选):自定义路由字段。可以选择部分主键列作为路由字段,在进行索引数据写入时,会根据路由字段的值计算索引数据的分布位置,路由字段的值相同的记录会被索引到相同的数据分区中。
indexSort
索引预排序设置,包含sorters设置。如果不设置,则默认按照主键排序。
含有Nested类型的索引不支持indexSort,没有预排序。
sorters(可选):索引的预排序方式,支持按照主键排序和字段值排序。关于排序的更多信息,请参见 排序和翻页 。
PrimaryKeySort表示按照主键排序,包含如下设置:
order:排序的顺序,可按升序或者降序排序,默认为升序(SortOrder.ASC)。
FieldSort表示按照字段值排序,包含如下设置:
只有建立索引且开启排序与统计聚合功能的字段才能进行预排序。
fieldName:排序的字段名。
order:排序的顺序,可按照升序或者降序排序,默认为升序(SortOrder.ASC)。
mode:当字段存在多个值时的排序方式。
timeToLive
可选参数,默认值为-1。数据生命周期(TTL),即数据的保存时间。
当数据的保存时间超过设置的数据生命周期时,系统会自动清理超过数据生命周期的数据。
数据生命周期至少为86400秒(一天)或-1(数据永不过期)。
多元索引生命周期的使用方式,请参见 生命周期管理 。
以下示例用于创建一个多元索引,多元索引包含Col_Keyword和Col_Long两列,类型分别设置为字符串(String)和整型(Long)。多元索引按照数据表主键进行预排序且数据永不过期。
private static void createSearchIndex(SyncClient client) { CreateSearchIndexRequest request = new CreateSearchIndexRequest(); //设置数据表名称。 request.setTableName("<TABLE_NAME>"); //设置多元索引名称。 request.setIndexName("<SEARCH_INDEX_NAME>"); IndexSchema indexSchema = new IndexSchema(); indexSchema.setFieldSchemas(Arrays.asList( //设置字段名和类型。 new FieldSchema("Col_Keyword", FieldType.KEYWORD), new FieldSchema("Col_Long", FieldType.LONG))); request.setIndexSchema(indexSchema); //调用client创建多元索引。 client.createSearchIndex(request); }
以下示例用于创建一个多元索引,多元索引包含Col_Keyword、Col_Long、Col_Text和Timestamp四列,类型分别设置为字符串(String)、整型(Long)、分词字符串(TEXT)和整型(Long)。同时配置按照Timestamp列进行预排序。
private static void createSearchIndexWithIndexSort(SyncClient client) { CreateSearchIndexRequest request = new CreateSearchIndexRequest(); //设置数据表名称。 request.setTableName("<TABLE_NAME>"); //设置多元索引名称。 request.setIndexName("<SEARCH_INDEX_NAME>"); IndexSchema indexSchema = new IndexSchema(); indexSchema.setFieldSchemas(Arrays.asList( new FieldSchema("Col_Keyword", FieldType.KEYWORD), new FieldSchema("Col_Long", FieldType.LONG), new FieldSchema("Col_Text", FieldType.TEXT), new FieldSchema("Timestamp", FieldType.LONG) .setEnableSortAndAgg(true))); //设置按照Timestamp列进行预排序。 indexSchema.setIndexSort(new Sort( Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC)))); request.setIndexSchema(indexSchema); //调用client创建多元索引。 client.createSearchIndex(request); }
请确保数据表的更新状态为禁止。
以下示例用于创建一个多元索引,多元索引包含Col_Keyword和Col_Long两列,类型分别设置为字符串(String)和整型(Long)。同时指定多元索引生命周期为7天。
// 请使用5.12.0及以上版本的Java SDK。 public static void createIndexWithTTL(SyncClient client) { int days = 7; CreateSearchIndexRequest createRequest = new CreateSearchIndexRequest(); //设置数据表名称。 createRequest.setTableName("<TABLE_NAME>"); //设置多元索引名称。 createRequest.setIndexName("<SEARCH_INDEX_NAME>"); IndexSchema indexSchema = new IndexSchema(); indexSchema.setFieldSchemas(Arrays.asList( //设置字段名和类型。 new FieldSchema("Col_Keyword", FieldType.KEYWORD), new FieldSchema("Col_Long", FieldType.LONG))); createRequest.setIndexSchema(indexSchema); //设置多元索引TTL。 createRequest.setTimeToLiveInDays(days); //调用client创建多元索引。 client.createSearchIndex(createRequest); }
以下示例用于创建一个多元索引,多元索引包含Col_Keyword和Col_Long两列,同时创建虚拟列Col_Keyword_Virtual_Long和Col_Long_Virtual_Keyword。Col_Keyword_Virtual_Long映射为数据表中Col_Keyword列,虚拟列Col_Long_Virtual_Keyword映射为数据表中Col_Long列。
private static void createSearchIndex(SyncClient client) { CreateSearchIndexRequest request = new CreateSearchIndexRequest(); //设置数据表名称。 request.setTableName("<TABLE_NAME>"); //设置多元索引名称。 request.setIndexName("<SEARCH_INDEX_NAME>"); IndexSchema indexSchema = new IndexSchema(); indexSchema.setFieldSchemas(Arrays.asList( //设置字段名和类型。 new FieldSchema("Col_Keyword", FieldType.KEYWORD), //设置字段名和类型。 new FieldSchema("Col_Keyword_Virtual_Long", FieldType.LONG) //设置字段是否为虚拟列。 .setVirtualField(true) //虚拟列对应的数据表中字段。 .setSourceFieldName("Col_Keyword"), new FieldSchema("Col_Long", FieldType.LONG), new FieldSchema("Col_Long_Virtual_Keyword", FieldType.KEYWORD) .setVirtualField(true) .setSourceFieldName("Col_Long"))); request.setIndexSchema(indexSchema); //调用client创建多元索引。 client.createSearchIndex(request); }
多元索引路由字段的使用
使用GetRange接口和Search接口范围查询数据时的区别
表格存储是否支持存储JSON数据?
使用多元索引Search接口查不到数据
如何查看表的总行数
表格存储是否支持类似关系数据库的in和between...and查询
如何将多元索引Search接口查询数据的limit提高到1000
如何批量删除数据
使用多元索引时出现field:xx must enable enable_sort_and_agg异常
创建多元索引后,您可以选择合适的查询类型进行多维度数据查询。多元索引查询类型包括 精确查询 、 多词精确查询 、 全匹配查询 、 匹配查询 、 短语匹配查询 、 前缀查询 、 范围查询 、 通配符查询 、 地理位置查询 、 多条件组合查询 、 嵌套类型查询 和 列存在性查询 。
当通过Search接口查询数据时,如果要对结果集进行排序或者翻页,您可以使用排序和翻页功能来实现。具体操作,请参见 排序和翻页 。
当通过Search接口查询数据时,如果要按照某一列对结果集做折叠,使对应类型的数据在结果展示中只出现一次,您可以使用折叠(去重)功能来实现。具体操作,请参见 折叠(去重) 。
如果希望清理多元索引中的历史数据或者希望延长数据保存时间时,您可以修改多元索引的数据生命周期。具体操作,请参见 生命周期管理 。
如果要进行数据分析,例如求最值、求和、统计行数等,您可以使用Search接口的统计聚合功能或者SQL查询来实现。具体操作,请参见 统计聚合 和 SQL查询 。
如果要快速导出数据,而不关心整个结果集的顺序时,您可以使用ParallelScan接口和ComputeSplits接口实现多并发导出数据。具体操作,请参见 并发导出数据 。
如果要在多元索引中新增、更新或者删除索引列,您可以使用动态修改schema功能实现。具体操作,请参见 动态修改schema 。
如果要获取某个数据表关联的所有多元索引的列表信息,您可以使用列出多元索引列表功能实现。具体操作,请参见 列出多元索引列表 。
如果要查询多元索引的描述信息,包括多元索引的字段信息和索引配置等,您可以使用查询多元索引描述信息功能实现。具体操作,请参见 查询多元索引描述信息 。
如果不再需要使用多元索引,您可以删除多元索引。具体操作,请参见 删除多元索引 。