搜索模型
概念
搜索模型主要是为了增强业务模型在大数据量模糊查询场景下的检索能力。
由于MySQL并不适合用于处理大数据量查询需求,所以我们引入了当下应用广泛并具有优秀性能表现的分布式搜索和分析引擎 Elasticsearch ,为了在机制层面上屏蔽掉对 Elasticsearch 的操作处理,给开发人员提供更加易用的使用方式,因此引入了搜索模型的概念,作为Trantor的一种资源纳入到MetaStore的资源管理体系内。
搜索模型的数据来源一般是从一个或者多个业务模型中抽取字段组成的便于查询的新模型。因此在业务模型相应字段数据发生变更时,需要同步变更数据到搜索模型中。
有关通过DS操作SearchModel的方式请参考DS-Search概念
关于回表机制请查看回表机制
定义
如下图,搜索模型的定义即在定义一个模型时配置信息 开启搜索 设置为是。目前Trantor1.0仅支持业务模型配置为搜索模型。

搜索模型数据操作
所有的搜索模型操作和持久化模型基本一致,只是入口不一样
Trantor 会在原有的 DS 类上,增加一个 Search 类,用来描述所有搜索的操作
并且常见查询依然通过 TSQL 的方式来展现,只有一些特殊场景,比如涉及权重,Geo 运算等场景,会使用特殊 DSL
搜索模型模型变更和数据同步
和持久化模型一起定义的搜索模型在创建或者执行模型变更的时候,都需要执行一次全量同步将持久化模型中定义同步到ES上,可在【交互控制台 > 模块 > 模型 > 模型详情】通过按钮操作。示例如下:

查询
搜索目前会提供两个最常见的搜索场景,一个是 List,一个是 Paging,示例如下:
public void showcase() { // search by sql List<ItemSO> data = Search.findAll(ItemSO.class,select,where,params); Paging<ItemSO> data = Search.paging(ItemSO.class,select,where,params);
// search by query model List<ItemSO> data = Search.findAll(qItemSO); Paging<ItemSO> data = Search.paging(qItemSO);}后续有一些搜索独有的特殊场景,用 sql 可能不太好表达,则可以使用 SearchQuery 对象来描述,示例如下(这部分有需求再提供):
QItemSO qItemSO = new QItemSO(); qItemSO.where( f -> f.bool() .must(f.bool().filter(f.matchQuery(ItemSO.isOnShelf_field,1).boosts(2.00f)) .should(f.matchQuery(ItemSO.isOnShelf_field,1).boosts(3.00f))) .must(f.existsQuery(ItemSO.id_field)) .should(f.fuzzyQuery(ItemSO.idName_field,"1")) .filter(f.rangeQuery(ItemSO.itemPrice_field).gt(10).lt(18)) .must(f.termsQuery(ItemSO.id_field,10000L)) );