搜索模型回表机制
Search Index 搜索回表机制
目前对搜索模型的使用是基于 ElasticSearch 完成快速检索,根据 ES 内存储的数据结构的不同,对搜索模型的使用方式存在一点差异:
-
SearchModel声明所有业务需要检索的数据,包括检索字段和其他业务字段、展示字段
- 这种方式的优点就是只要一次查询就能拿到所有需要的数据,缺点也很明显,数据会大量冗余,数据同步和一致性也会受很大影响,一般较少使用。
-
SearchModel只声明用于检索场景的字段
-
在实际业务场景中 SearchModel 应该是这种贴近“索引”的使用方式,基本逻辑是通过搜索关键字从 ElasticSearch 中找到匹配的索引ID,然后再根据索引ID去数据库里查询相关数据记录;
-
而按照目前 Trantor 提供的机制去使用,需要业务开发人员主动实现“Index IDs -> Business Data”过程,即需要编写额外的 Flow/Function 来完成这个“回表”动作,因此我们提出新的“Search Index”机制去完善和内部处理掉整个检索过程。
-
如何使用
开启回表,只需要在前端<Search>标签指定model属性即可,但需要满足下面的前提:
- 目前只支持
/load-data数据接口走DataStore查询方式,即视图里声明了dataCondition="" <Search>配置的model(下面简称searchModelKey)必须是一个SearchModel<Table>的model配置成当前视图需要展示的数据模型- 用于回表的索引ID数据必须存储在searchModelKey的 id 字段中
搜索模型示例
@Data@Model@SearchModel(name = "Item aggregation search model object")public class ItemAggregationSO extends BaseModel<Long> {
@Field(name = "商品名称") private String itemName; @Field(name = "品牌名称") private String brandName; @Field(name = "分类名称") private String categoryName; @Field(name = "商品价格") private Currency itemPrice;}// 定义 SearchModel 维护检索信息ItemAggregationSO aggregationSO = new ItemAggregationSO();aggregationSO.setItemName("小米米家走步机多功能自动跑步机");aggregationSO.setBrandName("MIJIA/米家");aggregationSO.setCategoryName("健身器材");aggregationSO.setItemPrice(BigDecimal.valueOf(1799.00));// 存储目标商品数据主键ID,通过搜索模型 id 字段维护目标商品关联,1000L是模拟商品主键IDaggregationSO.setId(1000L);DS.save(aggregationSO);视图代码示例
<View title="Brand" forModel="md_BrandBO" type="List"> <!-- 数据容器模型声明:Table.model: example_model_ItemBO --> <Table key="table" model="example_model_ItemBO" dataCondition=""> <!-- 搜索容器模型声明:Search.model: example_model_ItemAggregationSO --> <Search model="example_model_ItemAggregationSO"> <Fields> <Field name="itemName"/> <Field name="brandName"/> <Field name="categoryName"/> </Fields> </Search> <RecordActions label="操作"> <Action label="详情" targetView="md_BrandBO__Detail__builtIn"/> <Action label="编辑" targetView="md_BrandBO__Form__builtIn"/> <Action label="删除" logicFunction="md_DeleteBrandBOBuiltInFunc" after="Refresh"/> </RecordActions> <Fields> <Field name="itemCode"/> <Field name="itemName"/> <Field name="itemType"/> <Field name="itemDesc"/> <Field name="itemImage"/> <Field name="itemPrice"/> <Field name="categoryBO"/> </Fields> <Actions> <Action type="Create" targetView="md_BrandBO__Form__builtIn"/> </Actions> </Table></View>请求Body实例
{ "modelKey": "example_model_ItemBO", // 关键定义:Table 容器模型声明 "searchModelKey": "example_model_ItemAggregationSO", // 关键定义:SearchModel "search": { "queryParams": { "select": { "fields": [ {"name": "id"}, {"name": "itemCode"}, {"name": "itemName"}, {"name": "itemType"}, {"name": "itemDesc"}, {"name": "itemImage"}, {"name": "itemPrice"}, { "name": "categoryBO", "fields": [ {"name": "id"}, {"name": "name"} ] } ] }, "order": { "field": "updatedAt", "asc": false }, "page": { "no": 1, "size": 10 }, "fuzzyValue": "keytext", }, "brandName": { "type": "One", "value": "跑步机" }, "categoryName": { "type": "One", "value": "健身器材" } }, "singleResult": false}调用过程时序图
