行业算法版支持OBJECT和NESTED两种复合数据类型,允许将多个字段组合在一起,形成嵌套结构。正确使用复合数据类型,能提升查询准确性,避免错误匹配,让复杂数据管理更高效。
使用须知
在数据格式层面,OBJECT与NESTED接收相同结构的JSON数据,且基础配置方法相似。但二者在查询行为上有本质区别:NESTED保持对象边界完整性,而 OBJECT会扁平化数据。
类型 | OBJECT | NESTED |
底层存储方式 | 扁平化(Flattened)存储,丢失对象边界。 | 采用主子文档独立存储,保留对象完整性。 |
查询语义 | 可能出现跨对象匹配情况,但是性能更优。 可以匹配到 Alice(30岁)和 Bob(25岁)的不同user对象。 | 严格限制为同一个对象。 只能匹配 name="Alice" 且 age=30 的同一个 user 对象。 |
使用限制
OBJECT和NESTED内部字段会按照层级铺平(通过下划线拼接),可以在索引结构和属性字段中进行配置。
行业算法版中对OBJECT和NESTED字段有以下限制:
字段总个数不能超过10个;
字段最大嵌套深度为5层;
字段本身不能作为属性;
同级别其他字段名不能以
{OBJECT字段名}_或者{NESTED字段名}_为前缀(比如某个OBJECT字段名为abc,同级别其他字段名不能为abc_d等);只支持独享型应用。
OBJECT和NESTED内部字段有以下使用限制:
不支持向量分析器;
不能配置为分列字段、倒排索引排序字段、向量索引命名空间;
不支持组合索引;
建立的索引名必须与字段名相同;
不支持排序表达式;
不能配置为展示字段;
不能配置为模型训练字段。
使用示例
应用创建
详细语法请参见Schema。
{
"name": "json_nested",
"type": "NESTED",
"primaryKey": false,
"innerSchema": {
"job": {
"name": "job",
"type": "TEXT",
"primaryKey": false
},
"ssn": {
"name": "ssn",
"type": "LITERAL",
"primaryKey": false
}
}
}字段 | 类型 | 描述 |
type | String | 字段类型,详细字段信息请参见应用结构。 |
name | String | 字段名 |
primaryKey | Boolean | 是否是主键 |
joinWith | Array | 外表链接的数据表集合 |
innerSchema | Object | 当字段类型为 |
数据推送
以OBJECT类型为例,字段整体作为一个JSON字符串。
[
{
"cmd": "add",
"timestamp": 1401342874777,
"fields": {
"id": "1",
"title": "This is the title",
"json_nested": "[{\"job\":\"其他\",\"ssn\":\"abc\"}]"
}
},
{
"cmd": "update",
"timestamp": 1401342874778,
"fields": {
"id": "1",
"json_nested": "{\"job\":\"安全员\",\"ssn\":\"abc\"}" // 可以为单个object
}
},
{
"cmd": "delete",
"fields": {
"id": "1"
}
}
]搜索
使用OBJECT和NESTED内部字段索引时,与普通字段索引一致;
使用NESTED内部字段进行过滤时,需要在config子句中增加
sub_doc:group或sub_doc:flat;使用NESTED内部字段进行排序时,需要在config子句中增加
sub_doc:flat。
示例:
query=json_nested_job:'其他'&&filter=json_nested_ssn="abc"&&sort=json_nested_ssn;-RANK&&config=sub_doc:flatsub_doc:flat模式相比sub_doc:group性能稍差。