Нагрузка

Одна из важных особенностей Qdrant - это возможность хранить дополнительную информацию вне векторов (управление бизнес-атрибутами хранения). В терминологии Qdrant эта дополнительная информация называется "нагрузкой".

Qdrant позволяет хранить любую информацию, которая может быть представлена с использованием JSON.

Вот пример типичной нагрузки:

{
    "name": "куртка",
    "color": ["красный", "синий"],
    "quantity": 10,
    "price": 11.99,
    "location": [
        {
            "longitude": 52.5200,
            "latitude": 13.4050
        }
    ],
    "reviews": [
        {
            "user": "Алиса",
            "score": 4
        },
        {
            "user": "Боб",
            "score": 5
        }
    ]
}

Типы нагрузки

Помимо хранения нагрузок, Qdrant также позволяет выполнять поиск на основе определенных типов значений. Эта функция реализована как дополнительные фильтры в процессе поиска и позволяет встраивать пользовательскую логику поверх семантической близости.

Во время процесса фильтрации Qdrant будет проверять условия значений, соответствующих критериям фильтра. Если тип хранящегося значения не соответствует критериям фильтра, оно считается недопустимым.

Например, применение диапазонных условий к строковым данным приведет к пустому выводу.

Однако обработка массивов (несколько значений одного типа) немного отличается. Когда мы применяем фильтры к массиву, если хотя бы одно значение в массиве соответствует условию, фильтр будет выполнен успешно.

Подробное обсуждение процесса фильтрации проводится в разделе о фильтрации.

Давайте рассмотрим поддерживаемые типы данных Qdrant:

Целое число

integer - 64-битное целое число от -9223372036854775808 до 9223372036854775807.

Примеры одного и нескольких значений типа integer:

{
    "quantity": 10,
    "sizes": [35, 36, 38]
}

Дробное число

float - 64-битное числовое значение с плавающей запятой.

Примеры одного и нескольких значений типа float:

{
    "price": 11.99,
    "rating": [9.1, 9.2, 9.4]
}

Логическое значение

bool - бинарное значение. Равно true или false.

Примеры одного и нескольких значений типа bool:

{
    "delivered": true,
    "replies": [false, false, true, false]
}

Ключевое слово

keyword - строковое значение.

Примеры одного и нескольких значений типа keyword:

{
    "name": "Алиса",
    "friends": [
        "Боб",
        "Ева",
        "Джек"
    ]
}

Географические координаты

geo используется для представления географических координат.

Примеры одного и нескольких значений типа geo:

{
    "location": {
        "longitude": 52.5200,
        "latitude": 13.4050
    },
    "cities": [
        {
            "longitude": 51.5072,
            "latitude": 0.1276
        },
        {
            "longitude": 40.7128,
            "latitude": 74.0060
        }
    ]
}

Координаты должны быть описаны как объект, содержащий два поля: longitude - представляющий долготу, latitude - представляющий широту.

Создание точек с нагрузкой

REST API (архитектура)

PUT /collections/{collection_name}/points

{
    "points": [
        {
            "id": 1,
            "vector": [0.05, 0.61, 0.76, 0.74],
            "payload": {"city": "Берлин", "price": 1.99}
        },
        {
            "id": 2,
            "vector": [0.19, 0.81, 0.75, 0.11],
            "payload": {"city": ["Берлин", "Лондон"], "price": 1.99}
        },
        {
            "id": 3,
            "vector": [0.36, 0.55, 0.47, 0.94],
            "payload": {"city": ["Берлин", "Москва"], "price": [1.99, 2.99]}
        }
    ]
}

Настройка полезной нагрузки

REST API (Схема):

POST /collections/{имя_коллекции}/points/payload

{
    "payload": {
        "свойство1": "строка",
        "свойство2": "строка"
    },
    "точки": [
        0, 3, 100
    ]
}

Удаление полезной нагрузки

Этот метод удаляет указанные ключи полезной нагрузки из указанных точек.

REST API (Схема):

POST /collections/{имя_коллекции}/points/payload/delete

{
    "ключи": ["цвет", "цена"],
    "точки": [0, 3, 100]
}

Очистка полезной нагрузки

Этот метод удаляет все ключи полезной нагрузки из указанных точек.

REST API (Схема):

POST /collections/{имя_коллекции}/points/payload/clear

{
    "точки": [0, 3, 100]
}

Вы также можете использовать models.FilterSelector, чтобы удалить точки, соответствующие заданным условиям фильтра, вместо предоставления идентификаторов.

Индексация полезной нагрузки

Для эффективного проведения фильтрованных поисков Qdrant позволяет создать индекс для полей полезной нагрузки, указав имя и тип поля.

Индексированные поля также влияют на векторный индекс.

На практике рекомендуется создавать индексы на поля, которые наиболее вероятно ограничат результаты поиска. Например, индексация по идентификатору объекта будет эффективнее, чем индексация по цвету, поскольку идентификатор объекта уникален для каждой записи, в то время как цвет имеет только несколько возможных значений.

При составных запросах, включающих несколько полей, Qdrant попытается сначала использовать наиболее ограничивающий индекс.

Для создания индекса для поля можно использовать следующее:

REST API (Схема)

PUT /collections/{имя_коллекции}/index

{
    "field_name": "название индексируемого поля",
    "field_schema": "ключевое слово"
}

Индексированные поля отображаются в схеме полезной нагрузки вместе с API информации о коллекции.

Пример схемы полезной нагрузки:

{
    "payload_schema": {
        "свойство1": {
            "тип_данных": "ключевое слово"
        },
        "свойство2": {
            "тип_данных": "целое число"
        }
    }
}