跳转到内容

搜索模型回表机制

Search Index 搜索回表机制

目前对搜索模型的使用是基于 ElasticSearch 完成快速检索,根据 ES 内存储的数据结构的不同,对搜索模型的使用方式存在一点差异:

  1. SearchModel声明所有业务需要检索的数据,包括检索字段和其他业务字段、展示字段

    • 这种方式的优点就是只要一次查询就能拿到所有需要的数据,缺点也很明显,数据会大量冗余,数据同步和一致性也会受很大影响,一般较少使用。
  2. 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是模拟商品主键ID
aggregationSO.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
}

调用过程时序图

img