Interroger des collections pour obtenir des objets de données

L'API Query permet de récupérer des objets de données à partir d'une collection à l'aide d'un filtre. Cela revient à interroger une table de base de données et à utiliser une clause SQL WHERE. Vous pouvez également utiliser l'agrégation pour obtenir le nombre d'objets de données correspondant à un filtre.

Langage d'expression des filtres

En plus de la fonctionnalité de recherche KNN/ANN, Vector Search 2.0 offre des capacités de requête polyvalentes à l'aide d'un langage de requête personnalisé. Le langage de requête est expliqué dans le tableau suivant.

Filtre Description Types compatibles Exemple
$eq Fait correspondre les objets de données dont les valeurs de champ sont égales à une valeur spécifiée. Nombre, chaîne, booléen {"genre": {"$eq": "documentary"}}
$ne Fait correspondre les objets de données dont les valeurs de champ sont différentes d'une valeur spécifiée. Nombre, chaîne, booléen {"genre": {"$ne": "drama"}}
$gt Fait correspondre les objets de données dont les valeurs de champ sont supérieures à une valeur spécifiée. Nombre {"year": {"$gt": 2019}}
$gte Correspond aux objets de données dont les valeurs de champ sont supérieures ou égales à une valeur spécifiée. Nombre {"year": {"$gte": 2020}}
$lt Fait correspondre les objets de données dont les valeurs de champ sont inférieures à une valeur spécifiée. Nombre {"year": {"$lt": 2020}}
$lte Correspond aux objets de données dont les valeurs de champ sont inférieures ou égales à une valeur spécifiée. Nombre {"year": {"$lte": 2020}}
$in Fait correspondre les objets de données dont les valeurs de champ figurent dans un tableau spécifié. Chaîne {"genre": {"$in": ["comedy", "documentary"]}}
$nin Fait correspondre les objets de données dont les valeurs de champ ne figurent pas dans un tableau spécifié. Chaîne {"genre": {"$nin": ["comedy", "documentary"]}}
$et Joint les clauses de requête avec un ET logique. - {"$and": [{"genre": {"$eq": "drama"}}, {"year": {"$gte": 2020}}]}
$ou Joint les clauses de requête avec un OR logique. - {"$or": [{"genre": {"$eq": "drama"}}, {"year": {"$gte": 2020}}]}
$all Sélectionne les documents dont la valeur de tableau d'un champ contient toutes les valeurs spécifiées. - {"colors": {"$all": ["red", "blue"]}}

Interroger les collections

L'exemple suivant montre comment utiliser un filtre pour interroger des objets de données dans une collection dont l'ID est COLLECTION_ID.

REST

# Query Data Objects
curl -X POST \
'https://vectorsearch.googleapis.com/v1beta/projects/PROJECT_ID/locations/LOCATION/collections/COLLECTION_ID/dataObjects:query' \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H 'Content-Type: application/json' \
  -d '{
    "page_size": 10,
    "page_token": "",
    "filter": {
      "$or": [
        {
          "director": {
            "$eq": "Akira Kurosawa"
          }
        },
        {
          "$and": [
            {
              "director": {
                "$eq": "David Fincher"
              }
            },
            {
              "genre": {
                "$ne": "Thriller"
              }
            }
          ]
        }
      ]
    },
    "output_fields": {
      "data_fields": "*",
      "vector_fields": "*",
      "metadata_fields": "*"
    }
  }'

Python

from google.cloud import vectorsearch_v1beta

# Create the client
data_object_search_service_client = vectorsearch_v1beta.DataObjectSearchServiceClient()

# Initialize request
request = vectorsearch_v1beta.QueryDataObjectsRequest(
    parent="projects/PROJECT_ID/locations/LOCATION/collections/COLLECTION_ID",
    filter={
        "$or": [
            {"director": {"$eq": "Akira Kurosawa"}},
            {
                "$and": [
                    {"director": {"$eq": "David Fincher"}},
                    {"genre": {"$ne": "Thriller"}},
                ]
            },
        ]
    },
)

# Make the request
page_result = data_object_search_service_client.query_data_objects(request=request)

# Handle the response
for response in page_result:
    print(response)

Pour effectuer une agrégation, vous devez utiliser le point de terminaison aggregate et spécifier le type d'agrégation dans le corps de la requête.

L'exemple suivant montre comment compter tous les objets de données d'une collection avec l'ID COLLECTION_ID.

REST

curl -X POST \
'https://vectorsearch.googleapis.com/v1beta/projects/PROJECT_ID/locations/LOCATION/collections/COLLECTION_ID/dataObjects:aggregate' \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H 'Content-Type: application/json' \
  -d '{
    "aggregate": "count"
  }'

Python

from google.cloud import vectorsearch_v1beta

# Create the client
data_object_search_service_client = vectorsearch_v1beta.DataObjectSearchServiceClient()

# Initialize request
request = vectorsearch_v1beta.AggregateDataObjectsRequest(
    parent="projects/PROJECT_ID/locations/LOCATION/collections/COLLECTION_ID",
    aggregate="COUNT",
)

# Make the request
response = data_object_search_service_client.aggregate_data_objects(request=request)

# Handle the response
print(response)

Étape suivante