You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Weaviate嵌套JSON字段查询及Schema配置问题

Weaviate嵌套字段过滤问题解决方案

1. 嵌套字段的Schema定义与查询正确方式

  • Schema定义要求:必须显式声明嵌套对象的所有子属性。比如details作为object类型,要在其properties里列出FIRSTNAME、LASTNAME、EMAIL;experience作为对象数组,需设置dataType为["object[]"],同时定义内部对象的DETAILS、DATE属性。完整Schema示例:
    {
      "classes": [
        {
          "class": "Candidates",
          "properties": [
            {
              "name": "candidate_id",
              "dataType": ["string"]
            },
            {
              "name": "details",
              "dataType": ["object"],
              "properties": [
                { "name": "FIRSTNAME", "dataType": ["string"] },
                { "name": "LASTNAME", "dataType": ["string"] },
                { "name": "EMAIL", "dataType": ["string"] }
              ]
            },
            {
              "name": "experience",
              "dataType": ["object[]"],
              "properties": [
                { "name": "DETAILS", "dataType": ["string"] },
                { "name": "DATE", "dataType": ["string"] }
              ]
            }
          ],
          "vectorizer": "text2vec-transformers"
        }
      ]
    }
    
  • GraphQL查询:path参数用数组形式指定层级(如["details", "EMAIL"]),确保Schema中存在对应子字段即可正常查询,之前报错大概率是Schema未显式声明子属性。
  • Python客户端查询:不能用点分隔的属性名,需通过path数组指定层级:
    from weaviate.classes.query import Filter
    
    # 查询匹配details.EMAIL的候选人
    results = client.collections.get("Candidates").query.fetch_objects(
      filters=Filter(path=["details", "EMAIL"], equal="alice@example.com"),
      return_properties=["candidate_id", "details.EMAIL"]
    )
    

2. 是否需要扁平化嵌套属性?

不需要扁平化。Weaviate原生支持通过多层path过滤嵌套子字段,只要Schema正确定义了嵌套结构的所有属性,就可以直接使用层级过滤。扁平化会增加Schema的复杂度,完全没必要。

3. 过滤对象数组内的字段

针对数组内的对象字段过滤,需使用ContainsAny或ContainsAll运算符,同时在path中指定数组字段和目标子属性:

  • GraphQL示例(查找experience中包含"Company A"的候选人):
    {
      Get {
        Candidates(
          where: {
            path: ["experience", "DETAILS"]
            operator: ContainsAny
            valueTextArray: ["Company A"]
          }
        ) {
          candidate_id
          experience {
            DETAILS
            DATE
          }
        }
      }
    }
    
  • Python客户端示例:
    # 查询experience.DETAILS包含Company A的候选人
    results = client.collections.get("Candidates").query.fetch_objects(
      filters=Filter(path=["experience", "DETAILS"], contains_any=["Company A"]),
      return_properties=["candidate_id", "experience"]
    )
    

内容的提问来源于stack exchange,提问作者Nirmal Sankalana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:42:48