J'ai besoin de rechercher dans un tableau imbriqué dans un autre tableau. Disons que j'ai le document suivant

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

Je dois pouvoir rechercher dans le champ des barres ou au moins accéder à ce champ dans un profil de classement tout en pouvant également rechercher en fonction de baz. Ma première réflexion sur une solution serait de la structurer comme suit :

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 {}
}

Cela me permettrait de rechercher dans le cluster foo puis d'obtenir la référence foos correspondante, mais l'objectif global est de fournir à l'utilisateur une liste de documents foos qui nécessiterait plusieurs recherches dans la liste des documents foo renvoyés, ce qui entraînerait des recherches globalement lentes.

S'il existe une méthode recommandée pour gérer des situations comme celles-ci, toute aide serait appréciée. Merci.

4
Kyle Rowan 14 oct. 2020 à 21:40

1 réponse

Meilleure réponse

Tout d'abord, notez qu'un champ de référence utilisé pour les relations parent-enfant ne peut être qu'une valeur unique et non un tableau (https://docs.vespa.ai/documentation/reference/schema-reference.html#type:reference). Le champ de référence est spécifié dans le type enfant pour référencer le parent. Les schémas peuvent être définis comme suit, où foos est le type parent et foo est le type enfant :

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 {}
}

Vous pouvez maintenant rechercher des documents foo en utilisant les champs bars et foos_baz dans la requête. Utiliser le regroupement (https://docs.vespa.ai/documentation/grouping.html ) sur le champ foos_id pour structurer le résultat autour des documents foos à la place. Ceci est traité dans une seule requête de requête.

4
geirst 15 oct. 2020 à 15:15