[Документация Yandex Cloud](../../../index.md) > [Yandex Managed Service for PostgreSQL](../../index.md) > [Пошаговые инструкции](../index.md) > Расширения и словари PostgreSQL > vector

# Использование vector в Yandex Managed Service for PostgreSQL

Вы можете хранить векторные данные и выполнять векторный поиск в [Yandex Managed Service for PostgreSQL](../../index.md) с помощью расширения `vector`.

Расширение поддерживает:

* Точный и приблизительный поиск ближайших соседей.
* Различные типы векторов: одинарной точности, половинной точности, бинарные и разреженные векторы.
* Несколько метрик сравнения векторов: L2 (евклидово расстояние), косинусное расстояние, скалярное произведение, L1 (манхэттенское расстояние), расстояние Хэмминга и Жаккара.
* Работу с любым языком программирования, который поддерживает подключение к PostgreSQL.

Векторный поиск можно комбинировать с привычными возможностями PostgreSQL и SQL.

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

В `vector` поддерживается два типа индексов:

* HNSW — организует векторы в структуру данных, которая позволяет быстро переходить от одного похожего вектора к другому и находить ближайших соседей без проверки всей таблицы. В основе этой структуры лежит многослойный граф.
* IVFFlat — разбивает все векторы на несколько групп (списков). Во время поиска проверяются не все группы, а только те, которые наиболее близки к искомому вектору. По сравнению с HNSW этот индекс строится быстрее и использует меньше памяти, но уступает по качеству и скорости поиска.

Расширение `vector` доступно в кластерах Managed Service for PostgreSQL версии `13` и выше.

Подробнее о расширении `vector` читайте в его [документации](https://github.com/pgvector/pgvector).

## Установить расширение vector в кластер Yandex Managed Service for PostgreSQL {#vector-install}

Чтобы установить расширение в Managed Service for PostgreSQL, [добавьте расширение](cluster-extensions.md#update-extensions) `vector` в нужную базу данных.

## Примеры использования {#usage-example}

Подробнее об использовании `vector` в руководстве [Выполнение векторного поиска в Yandex Managed Service for PostgreSQL с помощью vector](../../tutorials/mpg-vector-extension.md).

### Выполнить векторный поиск {#vector-search}

Для получения расстояния в расширении `vector` используются следующие функции:

* `<->` — расстояние L2 (евклидово расстояние);
* `<#>` — отрицательное скалярное произведение;
* `<=>` — косинусное расстояние;
* `<+>` — расстояние L1 (манхэттенское расстояние);
* `<~>` — расстояние Хэмминга (для бинарных векторов);
* `<%>` — расстояние Жаккара (для бинарных векторов).

Чтобы найти ближайшие к заданному вектору записи по расстоянию L2, выполните запрос:

   ```sql
   SELECT *
   FROM <имя_таблицы>
   ORDER BY <имя_столбца> <-> '<вектор_запроса>'
   LIMIT <количество_результатов>;
   ```

Где:

* `<вектор_запроса>` — вектор, с которым сравниваются векторы из столбца. Например `[3, 1, 2]`.
* `<количество_результатов>` — количество возвращаемых результатов.

Также расширение `vector` поддерживает следующие поисковые запросы:

* поиск записей, наиболее похожих на существующую запись;
* поиск записей, находящихся ближе заданного расстояния;
* получение расстояния между векторами;
* получение значения скалярного произведения;
* получение косинусного сходства;
* вычисление среднего вектора.

Пример выполнения этих поисковых запросов приведен в руководстве [Выполнение векторного поиска в Yandex Managed Service for PostgreSQL с помощью vector](../../tutorials/mpg-vector-extension.md).

### Создать индекс {#create-index}

Индексы позволяют ускорить векторный поиск. Для каждой функции расчета расстояния нужно создавать свой индекс [HNSW](#HNSW) и [IVFFlat](#IVFFlat).

#### HNSW {#HNSW}

Чтобы создать HNSW-индекс для определенного расстояния, выполните запрос:

   ```sql
   CREATE INDEX ON <имя_таблицы>
   USING hnsw (<имя_столбца> <тип_расстояния>)
   WITH (
   m = <число_связей>,
   ef_construction = <число_кандидатов>
   );
   ```

   Где:

   * `<тип_расстояния>` — функция расчета расстояния, например `vector_l2_ops`. Подробнее в [документации](https://github.com/pgvector/pgvector#hnsw) расширения `vector`.
   * `m` — максимальное количество связей, которое может иметь вершина графа на каждом уровне. По умолчанию — `16`.
   * `ef_construction` — количество кандидатов, рассматриваемых при построении графа. По умолчанию — `64`. Чем выше значение, тем выше вероятность найти наиболее подходящие записи, но индекс строится дольше и операции вставки выполняются медленнее.

     Параметры `m` и `ef_construction` задаются один раз при создании индекса. Чтобы изменить их значения, пересоздайте индекс.

Чтобы настроить точность поиска, выполните запрос:

   ```sql
   SET hnsw.ef_search = <число_векторов>;
   ```

   Где `ef_search` — количество векторов, которые алгоритм рассматривает во время поиска. По умолчанию — `40`. Чем выше значение, тем выше вероятность найти наиболее похожие записи, но запрос будет выполняться медленнее.

   В отличие от параметров индекса `m` и `ef_construction`, параметр поиска `ef_search` можно изменять перед выполнением запросов.

#### IVFFlat {#IVFFlat}

Чтобы создать IVFFlat-индекс, выполните запрос:

   ```sql
   CREATE INDEX ON <имя_таблицы>
   USING ivfflat (<имя_столбца> <тип_расстояния>)
   WITH (
   lists = <число_групп>
   );
   ```

   Где:

   * `<тип_расстояния>` — функция расчета расстояния, например `vector_l2_ops`. Подробнее в [документации](https://github.com/pgvector/pgvector#ivfflat) расширения `vector`.
   * `lists` — количество групп (списков), на которые будут разделены векторы. Рекомендуемое значение зависит от объема данных. Чем больше групп, тем быстрее поиск, но качество поиска может снизиться.

     Параметр `lists` задается один раз при создании индекса. Чтобы изменить его значение, пересоздайте индекс. 

Чтобы настроить точность поиска, выполните запрос:

   ```sql
   SET ivfflat.probes = <число_групп_для_поиска>;
   ```

   Где `probes` — количество групп (списков), просматриваемых при выполнении поиска. По умолчанию — `1`. Чем больше значение, тем выше вероятность найти наиболее похожие записи, но ниже скорость выполнения запроса. 

   В отличие от параметра индекса `lists`, параметр поиска `probes` можно изменять перед выполнением запросов.