复合数据类型

行业算法版支持OBJECTNESTED两种复合数据类型,允许将多个字段组合在一起,形成嵌套结构。正确使用复合数据类型,能提升查询准确性,避免错误匹配,让复杂数据管理更高效。

使用须知

在数据格式层面,OBJECTNESTED接收相同结构的JSON数据,且基础配置方法相似。但二者在查询行为上有本质区别:NESTED保持对象边界完整性,而 OBJECT会扁平化数据。

类型

OBJECT

NESTED

底层存储方式

扁平化(Flattened)存储,丢失对象边界。
例如:
{ "user": [{"name":"Alice","age":30}, {"name":"Bob","age":25}] }
存储为:
user_name: ["Alice", "Bob"]
user_age: [30, 25]

采用主子文档独立存储,保留对象完整性。

查询语义

可能出现跨对象匹配情况,但是性能更优。
例:user_name: "Alice" AND user_age: 25

可以匹配到 Alice(30岁)和 Bob(25岁)的不同user对象。

严格限制为同一个对象。
例:user_name: "Alice" AND user_age: 30

只能匹配 name="Alice" 且 age=30 的同一个 user 对象。

使用限制

OBJECTNESTED内部字段会按照层级铺平(通过下划线拼接),可以在索引结构和属性字段中进行配置。

  • 行业算法版中对OBJECTNESTED字段有以下限制:

    • 字段总个数不能超过10个;

    • 字段最大嵌套深度为5层;

    • 字段本身不能作为属性;

    • 同级别其他字段名不能以{OBJECT字段名}_或者{NESTED字段名}_为前缀(比如某个OBJECT字段名为abc,同级别其他字段名不能为abc_d等);

    • 只支持独享型应用。

  • OBJECTNESTED内部字段有以下使用限制:

    • 不支持向量分析器;

    • 不能配置为分列字段、倒排索引排序字段、向量索引命名空间;

    • 不支持组合索引;

    • 建立的索引名必须与字段名相同;

    • 不支持排序表达式;

    • 不能配置为展示字段;

    • 不能配置为模型训练字段。

使用示例

应用创建

详细语法请参见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或者NESTED时指定其数据结构,支持嵌套。

数据推送

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"
        }
    }
]

搜索

  • 使用OBJECTNESTED内部字段索引时,与普通字段索引一致;

  • 使用NESTED内部字段进行过滤时,需要在config子句中增加sub_doc:groupsub_doc:flat

  • 使用NESTED内部字段进行排序时,需要在config子句中增加sub_doc:flat

示例:

query=json_nested_job:'其他'&&filter=json_nested_ssn="abc"&&sort=json_nested_ssn;-RANK&&config=sub_doc:flat
说明

sub_doc:flat模式相比sub_doc:group性能稍差。