搜索模型原理(已废弃,参见搜索模型操作手册)
对于将搜索模型同步到搜索引擎上,再通过Search API将搜索引擎上的数据搜索出来。所以搜索模型的主要功能是同步和搜索。
1.同步
按照功能划分,同步主要分为两种,一种是需要手动操作的全量同步,第二种是DS自动实现的增量同步。
1.1 全量同步
全量同步包括根据模型定义在搜索引擎上生成索引和将数据库中所有数据同步到搜索引擎索引上。
1.1.1 创建索引
DS根据相应的生成规则和模型定义的字段类型来生成搜索引擎上支持的数据类型,然后同步到搜索引擎上生成索引。 生成规则如下:
//两种格式分别对应:JDBCType中的格式,ES上的格式。DECIMAL(JDBCType.DECIMAL, "double"),TINYINT(JDBCType.TINYINT, "integer"),BOOLEAN(JDBCType.BOOLEAN, "boolean"),SMALLINT(JDBCType.SMALLINT, "integer"),INT(JDBCType.INTEGER, "integer"),FLOAT(JDBCType.REAL, "float"),DOUBLE(JDBCType.DOUBLE, "double"),NULL(JDBCType.NULL, "string"),TIMESTAMP(JDBCType.TIMESTAMP, "date"),BIGINT(JDBCType.BIGINT, "long"),MEDIUMINT(JDBCType.INTEGER, "integer"),DATE(JDBCType.DATE, "date"),TIME(JDBCType.TIME, "date"),DATETIME(JDBCType.TIMESTAMP, "date"),YEAR(JDBCType.DATE, "date"),VARCHAR(JDBCType.VARCHAR, "string"),VARBINARY(JDBCType.VARBINARY, "binary"),BIT(JDBCType.BIT, "boolean"),ENUM(JDBCType.CHAR, "string"),SET(JDBCType.CHAR, "string"),TINYBLOB(JDBCType.VARBINARY, "binary"),TINYTEXT(JDBCType.VARCHAR, "string"),MEDIUMBLOB(JDBCType.LONGVARBINARY, "binary"),MEDIUMTEXT(JDBCType.LONGVARCHAR, "string"),LONGBLOB(JDBCType.LONGVARBINARY, "binary"),LONGTEXT(JDBCType.LONGVARCHAR, "string"),BLOB(JDBCType.LONGVARBINARY, "binary"),TEXT(JDBCType.LONGVARCHAR, "string"),CHAR(JDBCType.CHAR, "string"),BINARY(JDBCType.BINARY, "binary"),GEOLOCATION(JDBCType.VARCHAR, "geo_point"),GEOAREA(JDBCType.LONGVARCHAR, "geo_shape"),UNKNOWN(JDBCType.OTHER, "string");在生成索引的同时,也会给索引添加一个别名,查询搜索模型数据的时候会全部通过索引别名进行。 使用别名方式搜索的优缺点:
- 好处:索引高可用。 在全量同步重建索引时,允许新的索引和旧的索引并存,在新的索引未完成构建时,索引别名指向旧的索引,当新的索引完成构建时,索引别名指向新的索引,从而确保在全量重建索引时索引数据仍然可用。
- 不足:需要双倍资源。 由于在全量同步重建索引时,允许新的索引和旧的索引并存,会占用搜索引擎更多的存储和计算资源,因此需要为搜索引擎服务器预留足够的硬件资源
别名的生成规则(projectId代表项目ID,modelName代表模型名):
String alias=("alias" + "_" + projectId + "_" + modelName).toLowerCase();1.1.2 数据同步
下面以MYSQL数据库举例,流程图大致如下:

- 为指定的搜索模型创建新的索引。
- 分页查询MySQL数据库中的数据并同步到ES上。
- 从Rocketmq接收增量同步的数据并同步到ES。
- 将搜索模型的ES别名更改为新索引。
- 删除搜索模型的ES旧索引。
全量任务完成后开始处理增量任务,增量任务存在一个追平的过程,追平结束的标识为待消费的MQ消息数量为零或者当前消费的消息时间戳与本机时间相差在1s。
1.2 增量同步
增量同步就是当模型数据发生增删改变化的时候,DS将发生变化的数据先持久化到数据库中,然后再同步到ES。(这也是增量同步都会产生延迟的原因)
1.2.1 实现流程
增量同步是由DS内部实现,通过DS数据变更产生MQ消息触发,下图主要为Trantor触发器监听搜索模型变更MQ并实现增量同步流程,红色框里即为DS增量同步的全流程。详细流程图如下:

- 更新搜索模型数据到DB。
- 发送搜索模型变更消息。
- DSSearch服务接受搜索模型变更消息。
- DSSearch服务将消息中变更的模型数据同步到ES。
- 确认搜索模型消息变更处理完成。
DS会根据SEARCH_PROJECT_IDS配置租户ID。如果没有配置SEARCH_PROJECT_IDS,Search会查询数据库的project表来生成相应的租户ID。
- DS设置的RocketMQ的Topic规则为DATASTORE_SUBSCRIBE_租户ID
- DS设置的RocketMQ的ConsumerGroup规则为GID_DSConsumerGroup_租户ID
2.搜索
搜索方式有两种,一是TSQL方式,一种是SearchQuery方式。
- TSQL方式是将TSQL解析后的SQL语句通过ElasticSearch-Sql框架解析为DSL语句,然后发送Http请求到ES上请求数据。
- SearchQuery方式是直接拼写DSL语句,然后发送Http请求到ES上请求数据。