如何配置Cube.js Schema以访问Elasticsearch嵌套类型字段
Elasticsearch嵌套字段对接的Cube.js Schema配置
ES里的nested类型字段是独立存储的子文档,不能直接在主cube里当普通字符串字段映射。Cube.js的ES驱动支持通过独立嵌套cube的方式对接这类字段,会自动生成符合ES语法的嵌套查询,不需要手动拼接查询DSL。
正确的Schema配置
// 顶层文档对应的主Cube cube(`Cubepoc`, { sql: `SELECT * FROM cubepoc`, // 声明和嵌套子文档的关联关系 joins: { PatientProduct: { relationship: `hasMany` } }, measures: {}, dimensions: { pname: { sql: `pname`, type: `string`, title: `Patient Name` }, pconcern: { sql: `pconcern`, type: `string`, title: `Patient Concern` }, // 移除原有错误的product string字段配置 } }); // 嵌套子文档对应的独立Cube cube(`PatientProduct`, { // 核心语法:用NESTED关键字绑定product的嵌套路径 sql: `SELECT * FROM cubepoc NESTED product`, measures: {}, dimensions: { medicine1: { sql: `product.medicine1`, type: `string`, title: `Medicine 1` }, medicine2: { sql: `product.medicine2`, type: `string`, title: `Medicine 2` } } });
配置关键注意点
- 嵌套cube必须在sql语句中通过
NESTED 嵌套路径语法声明,Cube.js会自动识别这个上下文,在生成ES查询时自动带上对应的nested.path参数,和手动写ES原生嵌套查询的逻辑完全一致 - 不能在主cube中直接映射嵌套字段下的属性(比如直接写
sql: product.medicine1),这种写法不会触发嵌套查询逻辑,会因为字段上下文不对导致查询结果异常 - 原有配置里把
product整体映射为string字段的写法,会把嵌套数组直接序列化为字符串返回,既无法做字段筛选,也没法访问内部的药品属性,必须移除 - 配置完成后,对嵌套cube内的字段做维度聚合、条件筛选时,Cube.js会自动在ES查询中注入对应的嵌套路径参数,和原生嵌套查询的查询结果完全一致
内容的提问来源于stack exchange,提问作者Vignesh G
相关产品推荐
相关产品推荐

