在结构中搜索非原始类型

Searching non-primitive types within a struct

我需要在一个嵌套在另一个数组中的数组中进行搜索。假设我有以下文件

schema foos {

    document foos {

        struct foo {
            field bars type array<string> {}
        }

        field baz type string {
            indexing: summary
        }

        field foos type array<foo> {
            indexing: summary
            struct-field bars { indexing: attribute } // breaks due to non-primitive typing
        }
    }
}

我需要能够在 bars 字段中进行搜索,或者至少能够在 rank-profile 中访问该字段,同时还能够基于 baz 进行搜索。我对解决方案的第一个想法是按如下方式构建它:

schema foos {

    document foos {

        field id type string {
            indexing: summary
        }

        field baz type string {
            indexing: summary | attribute
        }

        field foos type array<reference<foo>> {
            indexing: summary
        }
    }
}
schema foo {
    document foo {

        field foos_ref type reference<foos> {
            indexing: attribute
        }

        field bars type array<string> {
            indexing: summary | index
        }
    }
    
    import field foos_ref.baz as baz {}
}

这将允许我在 foo 集群中搜索然后获得相应的 foo 参考,但总体目标是为用户提供一个 foo 文档列表,这将需要从返回的 foo 文档列表中进行多次搜索,从而导致整体搜索速度较慢。

如果有推荐的方法来处理此类情况,我们将不胜感激。谢谢。

首先请注意,用于父子关系的引用字段只能是单值,不能是数组(https://docs.vespa.ai/documentation/reference/schema-reference.html#type:reference)。引用字段在子类型中指定以引用父类型。模式可以定义如下,其中 foos 是父类型,foo 是子类型:

schema foos {
  document foos {
    field id type string {
      indexing: summary | attribute
    }
    field baz type string {
      indexing: summary | attribute
    }
  }
}

schema foo {
  document foo {
    field foos_ref type reference<foos> {
      indexing: attribute
    }
    field bars type array<string> {
      indexing: summary | index
    }
  }
  import field foos_ref.baz as foos_baz {}
  import field foos_ref.id as foos_id {}
}

现在您可以使用 barsfoos_baz[=24 字段搜索 foo 文档=] 在查询中。在 foos_id 字段上使用分组 (https://docs.vespa.ai/documentation/grouping.html) 来围绕 foos 文档构建结果。这是在单个查询请求中处理的。