Datamaid 是一个实体数据管理平台。前期我介绍了它的数据落库能力。可以通过配置化把数据落到对应的存储。

那么,既然我们同时拥有了数据源信息、实体各字段信息、实体各字段的存储信息。

是否可以做一个统一的服务,直接完成数据的查询呢?

当然是可以的。它就是 datamaid-gateway

基于这个服务,我们可以实现:

  • 实体的查询
  • 实体的圈选
  • 调用方的管理
    • 字段鉴权
    • 查询日志/监控

查询 API 设计

查询实体数据有两种情况:

  • 已知实体 id,查询实体具体信息
  • 根据查询条件进行“圈选”的查询

为此我们设计了以下两个查询接口

通过 id 查询

1
GET /datamaid-api/entity/{entity_id}/:id

这里的第一个 {entity_id} 是注册在 Datamaid 系统里,我们为其分配的唯一 id

这里高工提了一个优化点:就是第一个{entity_id}参数不传入 id,而是为每个实体配置一个“有意义的英文名”作为 key,比如实体 88 代表汽车,查询 2 号车原来的查询是:

GET /datamaid-api/entity/88/2

改进后的查询就可以变成:

GET /datamaid-api/entity/car/2

看!更加 RESTful 了!

第二个:id 则是用户想要查询的实体的真实 ID

通过字段筛选

由于我们可以配置实体的底层存储使用 ES,所以我们可以实现大量的字段筛选能力。为此,我们设计了一个易用的筛选入参,用于映射成常见的 ES 查询条件。

  • 不是所有的字段都可筛选,我们在配置实体字段时,可以配置其是否可被筛选。不能筛选的字段,可以在 ES 自动建索引时被自动配置成 index:false
  • 基于上一条提到的配置,我们完全可以拓展到 MySQL 存储。只需要在可配置的字段建立索引。
1
GET /datamaid-api/search/entity/{entity_id}?query={}&page_no=1&page_size=10

其中 query 参数传入一个 json 字符串,其内容正是我们设计的查询格式:

{“key token”:value}

符号 token 含义
= 等值查询
in 范围
!=、!in 不等
range 区间查询
like 模糊

其中大部分符号比较好理解, range 这个需要特殊介绍一下,range 的设计是这样的:

  • 传入 min_max 就是左闭右开的区间匹配,min 或 max 可缺省,缺省则代表正负无穷。

  • 也可以传入一个数组,数组里的多个区间是”或“的关系。

这样,如果我想查 年龄在 18~24 之间 的10个用户,查询应该是这样的:

1
GET /datamaid-api/search/entity/1?query={"age range":"18_24"}&page_no=1&page_size=10

如果我想查 年龄在 18~24 或大于 60的10 个用户,查询应该是这样的:

1
GET /datamaid-api/search/entity/1?query={"age range":["18_24","80_"]}&page_no=1&page_size=10