Поиск с векторными вложениями

На этой странице показано, как использовать Cloud Firestore для выполнения поиска векторов методом k-ближайших соседей (KNN) с использованием следующих методов:

  • Сохраняйте значения вектора.
  • Создание и управление векторными индексами KNN
  • Выполните запрос k-ближайших соседей (KNN), используя одну из поддерживаемых мер векторного расстояния.

Прежде чем начать

Прежде чем сохранять векторные представления в Cloud Firestore , необходимо их сгенерировать. Cloud Firestore не генерирует векторные представления. Вы можете использовать такой сервис, как Vertex AI, для создания векторных значений, например, текстовых представлений из ваших данных в Cloud Firestore . Затем вы можете сохранить эти векторные представления обратно в документы Cloud Firestore .

Чтобы узнать больше об эмбеддингах, см. раздел «Что такое эмбеддинги?».

Чтобы узнать, как получить векторные представления текста с помощью Vertex AI , см. раздел «Получение векторных представлений текста» .

Хранить векторные представления

Следующие примеры демонстрируют, как хранить векторные представления в Cloud Firestore .

Операция записи с использованием векторного встраивания

В следующем примере показано, как сохранить векторное представление в документе Cloud Firestore :

Python
from google.cloud import firestore
from google.cloud.firestore_v1.vector import Vector

firestore_client = firestore.Client()
collection = firestore_client.collection("coffee-beans")
doc = {
    "name": "Kahawa coffee beans",
    "description": "Information about the Kahawa coffee beans.",
    "embedding_field": Vector([0.18332680, 0.24160706, 0.3416704]),
}

collection.add(doc)
Node.js
import {
  Firestore,
  FieldValue,
} from "@google-cloud/firestore";

const db = new Firestore();
const coll = db.collection('coffee-beans');
await coll.add({
  name: "Kahawa coffee beans",
  description: "Information about the Kahawa coffee beans.",
  embedding_field: FieldValue.vector([1.0 , 2.0, 3.0])
});
Идти
import (
	"context"
	"fmt"
	"io"

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

type CoffeeBean struct {
	Name           string             `firestore:"name,omitempty"`
	Description    string             `firestore:"description,omitempty"`
	EmbeddingField firestore.Vector32 `firestore:"embedding_field,omitempty"`
	Color          string             `firestore:"color,omitempty"`
}

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

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

	// Vector can be represented by Vector32 or Vector64
	doc := CoffeeBean{
		Name:           "Kahawa coffee beans",
		Description:    "Information about the Kahawa coffee beans.",
		EmbeddingField: []float32{1.0, 2.0, 3.0},
		Color:          "red",
	}
	ref := client.Collection("coffee-beans").NewDoc()
	if _, err = ref.Set(ctx, doc); err != nil {
		fmt.Fprintf(w, "failed to upsert: %v", err)
		return err
	}

	return nil
}
Java
import com.google.cloud.firestore.CollectionReference;
import com.google.cloud.firestore.DocumentReference;
import com.google.cloud.firestore.FieldValue;
import com.google.cloud.firestore.VectorQuery;

CollectionReference coll = firestore.collection("coffee-beans");

Map<String, Object> docData = new HashMap<>();
docData.put("name", "Kahawa coffee beans");
docData.put("description", "Information about the Kahawa coffee beans.");
docData.put("embedding_field", FieldValue.vector(new double[] {1.0, 2.0, 3.0}));

ApiFuture<DocumentReference> future = coll.add(docData);
DocumentReference documentReference = future.get();

Вычисление векторных вложений с помощью облачной функции.

Для вычисления и сохранения векторных представлений при каждом обновлении или создании документа можно настроить облачную функцию :

Python
@functions_framework.cloud_event
def store_embedding(cloud_event) -> None:
  """Triggers by a change to a Firestore document.
  """
  firestore_payload = firestore.DocumentEventData()
  payload = firestore_payload._pb.ParseFromString(cloud_event.data)

  collection_id, doc_id = from_payload(payload)
  # Call a function to calculate the embedding
  embedding = calculate_embedding(payload)
  # Update the document
  doc = firestore_client.collection(collection_id).document(doc_id)
  doc.set({"embedding_field": embedding}, merge=True)
Node.js
/**
 * A vector embedding will be computed from the
 * value of the `content` field. The vector value
 * will be stored in the `embedding` field. The
 * field names `content` and `embedding` are arbitrary
 * field names chosen for this example.
 */
async function storeEmbedding(event: FirestoreEvent<any>): Promise<void> {
  // Get the previous value of the document's `content` field.
  const previousDocumentSnapshot = event.data.before as QueryDocumentSnapshot;
  const previousContent = previousDocumentSnapshot.get("content");

  // Get the current value of the document's `content` field.
  const currentDocumentSnapshot = event.data.after as QueryDocumentSnapshot;
  const currentContent = currentDocumentSnapshot.get("content");

  // Don't update the embedding if the content field did not change
  if (previousContent === currentContent) {
    return;
  }

  // Call a function to calculate the embedding for the value
  // of the `content` field.
  const embeddingVector = calculateEmbedding(currentContent);

  // Update the `embedding` field on the document.
  await currentDocumentSnapshot.ref.update({
    embedding: embeddingVector,
  });
}
Идти
  // Not yet supported in the Go client library
Java
  // Not yet supported in the Java client library

Создание и управление векторными индексами

Прежде чем выполнять поиск ближайшего соседа с использованием векторных представлений, необходимо создать соответствующий индекс. В следующих примерах показано, как создавать и управлять векторными индексами с помощью Google Cloud CLI . Векторными индексами также можно управлять с помощью Firebase CLI и Terraform .

Создать векторный индекс

Перед созданием векторного индекса обновите Google Cloud CLI до последней версии:

gcloud components update

Для создания векторного индекса используйте gcloud firestore indexes composite create :`.

gcloud
gcloud firestore indexes composite create \
--collection-group=collection-group \
--query-scope=COLLECTION \
--field-config field-path=vector-field,vector-config='vector-configuration' \
--database=database-id

где:

  • collection-group — это идентификатор группы коллекций.
  • vector-field — это название поля, содержащего векторное представление.
  • database-id — это идентификатор базы данных.
  • vector-configuration включает dimension вектора и тип индекса. dimension — целое число до 2048. Тип индекса должен быть flat . Форматируйте конфигурацию индекса следующим образом: {"dimension":" DIMENSION ", "flat": "{}"} .

В следующем примере создается составной индекс, включающий векторный индекс для поля vector-field и восходящий индекс для поля " color . Этот тип индекса можно использовать для предварительной фильтрации данных перед поиском ближайшего соседа.

gcloud
gcloud firestore indexes composite create \
--collection-group=collection-group \
--query-scope=COLLECTION \
--field-config=order=ASCENDING,field-path="color" \
--field-config field-path=vector-field,vector-config='{"dimension":"1024", "flat": "{}"}' \
--database=database-id

Перечислите все векторные индексы

gcloud
gcloud firestore indexes composite list --database=database-id

Замените database-id на идентификатор базы данных.

Удалить векторный индекс

gcloud
gcloud firestore indexes composite delete index-id --database=database-id

где:

  • index-id — это идентификатор индекса, который нужно удалить. Используйте indexes composite list , чтобы получить идентификатор индекса.
  • database-id — это идентификатор базы данных.

Опишите векторный индекс

gcloud
gcloud firestore indexes composite describe index-id --database=database-id

где:

  • index-id — это идентификатор индекса, который необходимо описать. Используйте indexes composite list для получения идентификатора индекса.
  • database-id — это идентификатор базы данных.

Выполните запрос ближайшего соседа.

Вы можете выполнить поиск сходства, чтобы найти ближайших соседей векторного представления. Для поиска сходства требуются векторные индексы . Если индекс отсутствует, Cloud Firestore предложит создать индекс с помощью gcloud CLI .

В следующем примере находятся 10 ближайших соседей вектора запроса.

Python
from google.cloud.firestore_v1.base_vector_query import DistanceMeasure
from google.cloud.firestore_v1.vector import Vector

collection = db.collection("coffee-beans")

# Requires a single-field vector index
vector_query = collection.find_nearest(
    vector_field="embedding_field",
    query_vector=Vector([0.3416704, 0.18332680, 0.24160706]),
    distance_measure=DistanceMeasure.EUCLIDEAN,
    limit=5,
)
Node.js
import {
  Firestore,
  FieldValue,
  VectorQuery,
  VectorQuerySnapshot,
} from "@google-cloud/firestore";

// Requires a single-field vector index
const vectorQuery: VectorQuery = coll.findNearest({
  vectorField: 'embedding_field',
  queryVector: [3.0, 1.0, 2.0],
  limit: 10,
  distanceMeasure: 'EUCLIDEAN'
});

const vectorQuerySnapshot: VectorQuerySnapshot = await vectorQuery.get();
Идти
import (
	"context"
	"fmt"
	"io"

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

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

	// Create client
	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},
		5,
		// More info: https://firebase.google.com/docs/firestore/vector-search#vector_distances
		firestore.DistanceMeasureEuclidean,
		nil)

	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.Fprintln(w, doc.Data()["name"])
	}
	return nil
}
Java
import com.google.cloud.firestore.VectorQuery;
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);

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

Векторные расстояния

Запросы на поиск ближайшего соседа поддерживают следующие параметры векторного расстояния:

  • EUCLIDEAN : Измеряет EUCLIDEAN расстояние между векторами. Подробнее см. раздел «Евклидово расстояние» .
  • COSINE : сравнивает векторы на основе угла между ними, что позволяет измерять сходство, не основанное на величине векторов. Мы рекомендуем использовать DOT_PRODUCT с нормализованными векторами вместо расстояния COSINE, которое математически эквивалентно и обеспечивает лучшую производительность. Для получения дополнительной информации см. Косинусное сходство .
  • DOT_PRODUCT : Аналогично COSINE , но зависит от величины векторов. Подробнее см. скалярное произведение .

Выберите меру расстояния

В зависимости от того, нормализованы ли все ваши векторные представления, вы можете определить, какую меру расстояния использовать для вычисления меры расстояния. Нормализованное векторное представление имеет величину (длину) ровно 1,0.

Кроме того, если вам известно, с какой мерой расстояния была обучена ваша модель, используйте эту меру расстояния для вычисления расстояния между вашими векторными представлениями.

Нормализованные данные

Если у вас есть набор данных, в котором все векторные представления нормализованы, то все три меры расстояния дают одинаковые результаты семантического поиска. По сути, хотя каждая мера расстояния возвращает разное значение, эти значения сортируются одинаково. Когда векторные представления нормализованы, DOT_PRODUCT обычно является наиболее вычислительно эффективным, но разница в большинстве случаев незначительна. Однако, если ваше приложение очень чувствительно к производительности, DOT_PRODUCT может помочь в оптимизации производительности.

Ненормализованные данные

Если у вас есть набор данных, в котором векторные представления не нормализованы, то математически некорректно использовать DOT_PRODUCT в качестве меры расстояния, поскольку скалярное произведение не измеряет расстояние. В зависимости от способа генерации векторных представлений и предпочтительного типа поиска, либо COSINE , либо EUCLIDEAN расстояние дают субъективно лучшие результаты, чем другие меры. Для определения оптимального варианта для вашего случая может потребоваться экспериментирование с COSINE или EUCLIDEAN .

Неясно, нормализованы данные или нет.

Если вы не уверены, нормализованы ли ваши данные, и хотите использовать DOT_PRODUCT , мы рекомендуем вместо него использовать COSINE . COSINE аналогичен DOT_PRODUCT но с встроенной нормализацией. Расстояние, измеренное с помощью COSINE находится в диапазоне от 0 до 2 Результат, близкий к 0 указывает на очень большое сходство векторов.

Предварительная фильтрация документов

Для предварительной фильтрации документов перед поиском ближайших соседей можно комбинировать поиск по сходству с другими операторами запроса. Поддерживаются составные фильтры «и and or . Дополнительную информацию о поддерживаемых фильтрах полей см. в разделе «Операторы запроса» .

Python
from google.cloud.firestore_v1.base_vector_query import DistanceMeasure
from google.cloud.firestore_v1.vector import Vector

collection = db.collection("coffee-beans")

# Similarity search with pre-filter
# Requires a composite vector index
vector_query = collection.where("color", "==", "red").find_nearest(
    vector_field="embedding_field",
    query_vector=Vector([0.3416704, 0.18332680, 0.24160706]),
    distance_measure=DistanceMeasure.EUCLIDEAN,
    limit=5,
)
Node.js
// Similarity search with pre-filter
// Requires composite vector index
const preFilteredVectorQuery: VectorQuery = coll
    .where("color", "==", "red")
    .findNearest({
      vectorField: "embedding_field",
      queryVector: [3.0, 1.0, 2.0],
      limit: 5,
      distanceMeasure: "EUCLIDEAN",
    });

const vectorQueryResults = await preFilteredVectorQuery.get();
Идти
import (
	"context"
	"fmt"
	"io"

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

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

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

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

	// Similarity search with pre-filter
	// Requires a composite vector index
	vectorQuery := collection.Where("color", "==", "red").
		FindNearest("embedding_field",
			[]float32{3.0, 1.0, 2.0},
			5,
			// More info: https://firebase.google.com/docs/firestore/vector-search#vector_distances
			firestore.DistanceMeasureEuclidean,
			nil)

	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.Fprintln(w, doc.Data()["name"])
	}
	return nil
}
Java
import com.google.cloud.firestore.VectorQuery;
import com.google.cloud.firestore.VectorQuerySnapshot;

VectorQuery preFilteredVectorQuery = coll
        .whereEqualTo("color", "red")
        .findNearest(
                "embedding_field",
                new double[] {3.0, 1.0, 2.0},
                /* limit */ 10,
                VectorQuery.DistanceMeasure.EUCLIDEAN);

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

Получите вычисленное векторное расстояние.

Вычисленное векторное расстояние можно получить, присвоив имя выходному свойству distance_result_field в запросе FindNearest , как показано в следующем примере:

Python
from google.cloud.firestore_v1.base_vector_query import DistanceMeasure
from google.cloud.firestore_v1.vector import Vector

collection = db.collection("coffee-beans")

vector_query = collection.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",
)

docs = vector_query.stream()

for doc in docs:
    print(f"{doc.id}, Distance: {doc.get('vector_distance')}")
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'));
});
Идти
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
}
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",
)
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'
    });
Идти
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
}
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"));
}

Укажите пороговое значение расстояния.

Вы можете указать пороговое значение сходства, которое будет возвращать только документы, соответствующие этому порогу. Поведение поля «Порог» зависит от выбранной вами меры расстояния:

  • EUCLIDEAN и COSINE расстояния ограничивают пороговое значение документами, где расстояние меньше или равно заданному порогу. Эти меры расстояния уменьшаются по мере того, как векторы становятся более похожими.
  • Параметр DOT_PRODUCT distance ограничивает количество документов, для которых расстояние больше или равно указанному пороговому значению. Скалярное произведение увеличивается по мере того, как векторы становятся более похожими.

В следующем примере показано, как задать пороговое значение расстояния, чтобы получить до 10 ближайших документов, находящихся на расстоянии не более 4,5 единиц друг от друга, используя метрику расстояния EUCLIDEAN :

Python
from google.cloud.firestore_v1.base_vector_query import DistanceMeasure
from google.cloud.firestore_v1.vector import Vector

collection = db.collection("coffee-beans")

vector_query = collection.find_nearest(
    vector_field="embedding_field",
    query_vector=Vector([0.3416704, 0.18332680, 0.24160706]),
    distance_measure=DistanceMeasure.EUCLIDEAN,
    limit=10,
    distance_threshold=4.5,
)

docs = vector_query.stream()

for doc in docs:
    print(f"{doc.id}")
Node.js
const vectorQuery: VectorQuery = coll.findNearest({
  vectorField: 'embedding_field',
  queryVector: [3.0, 1.0, 2.0],
  limit: 10,
  distanceMeasure: 'EUCLIDEAN',
  distanceThreshold: 4.5
});

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

snapshot.forEach((doc) => {
  console.log(doc.id);
});
Идти
import (
	"context"
	"fmt"
	"io"

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

func vectorSearchDistanceThreshold(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{
			DistanceThreshold: firestore.Ptr[float64](4.5),
		})

	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.Fprintln(w, doc.Data()["name"])
	}
	return nil
}
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()
          .setDistanceThreshold(4.5)
          .build());

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

for (DocumentSnapshot document : vectorQuerySnapshot.getDocuments()) {
    System.out.println(document.getId());
}

Ограничения

При работе с векторными представлениями учитывайте следующие ограничения:

  • Максимально поддерживаемая размерность встраивания составляет 2048. Для хранения индексов большего размера используйте уменьшение размерности .
  • Максимальное количество документов, возвращаемых запросом ближайшего соседа, составляет 1000.
  • Векторный поиск не поддерживает прослушиватели снимков в реальном времени .
  • Векторный поиск поддерживается только клиентскими библиотеками Python, Node.js, Go и Java.

Что дальше?