使用向量嵌入搜索(续11)

Node.js
const vectorQuery: VectorQuery = coll.findNearest(
    {
      vectorField: 'embedding_field',
      queryVector: [3.0, 1.0, 2.0],
      limit: 10,
      distanceMeasure: 'EUCLIDEAN',
      distanceResultField: 'vector_distance'
    });

const snapshot: VectorQuerySnapshot = await vectorQuery.get();

snapshot.forEach((doc) => {
  console.log(doc.id, ' Distance: ', doc.get('vector_distance'));
});
Go
import (
    "context"
    "fmt"
    "io"

    "cloud.google.com/go/firestore"
)

func vectorSearchDistanceResultField(w io.Writer, projectID string) error {
    ctx := context.Background()

    client, err := firestore.NewClient(ctx, projectID)
    if err != nil {
        return fmt.Errorf("firestore.NewClient: %w", err)
    }
    defer client.Close()

    collection := client.Collection("coffee-beans")

    // Requires a vector index
    // https://firebase.google.com/docs/firestore/vector-search#create_and_manage_vector_indexes
    vectorQuery := collection.FindNearest("embedding_field",
        []float32{3.0, 1.0, 2.0},
        10,
        firestore.DistanceMeasureEuclidean,
        &firestore.FindNearestOptions{
            DistanceResultField: "vector_distance",
        })

    docs, err := vectorQuery.Documents(ctx).GetAll()
    if err != nil {
        fmt.Fprintf(w, "failed to get vector query results: %v", err)
        return err
    }

    for _, doc := range docs {
        fmt.Fprintf(w, "%v, Distance: %v\n", doc.Data()["name"], doc.Data()["vector_distance"])
    }
    return nil
}

vector_search_result_field.go
Java
import com.google.cloud.firestore.VectorQuery;
import com.google.cloud.firestore.VectorQueryOptions;
import com.google.cloud.firestore.VectorQuerySnapshot;

VectorQuery vectorQuery = coll.findNearest(
        "embedding_field",
        new double[] {3.0, 1.0, 2.0},
        /* limit */ 10,
        VectorQuery.DistanceMeasure.EUCLIDEAN,
        VectorQueryOptions.newBuilder().setDistanceResultField("vector_distance").build());

ApiFuture<VectorQuerySnapshot> future = vectorQuery.get();
VectorQuerySnapshot vectorQuerySnapshot = future.get();

for (DocumentSnapshot document : vectorQuerySnapshot.getDocuments()) {
    System.out.println(document.getId() + " Distance: " + document.get("vector_distance"));
}

如果您想使用字段掩码返回部分文档字段以及 distanceResultField,则还必须在字段掩码中添加 distanceResultField 的值,如以下示例所示:

Python
vector_query = collection.select(["color", "vector_distance"]).find_nearest(
    vector_field="embedding_field",
    query_vector=Vector([0.3416704, 0.18332680, 0.24160706]),
    distance_measure=DistanceMeasure.EUCLIDEAN,
    limit=10,
    distance_result_field="vector_distance",
)

vector_search.py
Node.js
const vectorQuery: VectorQuery = coll
    .select('name', 'description', 'vector_distance')
    .findNearest({
      vectorField: 'embedding_field',
      queryVector: [3.0, 1.0, 2.0],
      limit: 10,
      distanceMeasure: 'EUCLIDEAN',
      distanceResultField: 'vector_distance'
    });
Go
import (
    "context"
    "fmt"
    "io"

    "cloud.google.com/go/firestore"
)

func vectorSearchDistanceResultFieldMasked(w io.Writer, projectID string) error {
    ctx := context.Background()

    client, err := firestore.NewClient(ctx, projectID)
    if err != nil {
        return fmt.Errorf("firestore.NewClient: %w", err)
    }
    defer client.Close()

    collection := client.Collection("coffee-beans")

    // Requires a vector index
    // https://firebase.google.com/docs/firestore/vector-search#create_and_manage_vector_indexes
    vectorQuery := collection.Select("color", "vector_distance").
        FindNearest("embedding_field",
            []float32{3.0, 1.0, 2.0},
            10,
            firestore.DistanceMeasureEuclidean,
            &firestore.FindNearestOptions{
                DistanceResultField: "vector_distance",
            })

    docs, err := vectorQuery.Documents(ctx).GetAll()
    if err != nil {
        fmt.Fprintf(w, "failed to get vector query results: %v", err)
        return err
    }

    for _, doc := range docs {
        fmt.Fprintf(w, "%v, Distance: %v\n", doc.Data()["color"], doc.Data()["vector_distance"])
    }
    return nil
}

vector_search_result_field_masked.go
Java
import com.google.cloud.firestore.VectorQuery;
import com.google.cloud.firestore.VectorQueryOptions;
import com.google.cloud.firestore.VectorQuerySnapshot;

VectorQuery vectorQuery = coll
        .select("name", "description", "vector_distance")
        .findNearest(
          "embedding_field",
          new double[] {3.0, 1.0, 2.0},
          /* limit */ 10,
          VectorQuery.DistanceMeasure.EUCLIDEAN,
          VectorQueryOptions.newBuilder()
            .setDistanceResultField("vector_distance")
            .build());

ApiFuture<VectorQuerySnapshot> future = vectorQuery.get();
VectorQuerySnapshot vectorQuerySnapshot = future.get();

for (DocumentSnapshot document : vectorQuerySnapshot.getDocuments()) {
    System.out.println(document.getId() + " Distance: " + document.get("vector_distance"));
}