Carga

Uma das características importantes do Qdrant é a capacidade de armazenar informações adicionais fora dos vetores (atributos de negócios de gerenciamento de armazenamento). Na terminologia do Qdrant, essas informações adicionais são referidas como "carga útil".

O Qdrant permite que você armazene qualquer informação que possa ser representada usando JSON.

Aqui está um exemplo de uma carga útil típica:

{
    "name": "jaqueta",
    "cor": ["vermelho", "azul"],
    "quantidade": 10,
    "preço": 11,99,
    "localização": [
        {
            "longitude": 52.5200,
            "latitude": 13.4050
        }
    ],
    "avaliações": [
        {
            "usuário": "Alice",
            "pontuação": 4
        },
        {
            "usuário": "Bob",
            "pontuação": 5
        }
    ]
}

Tipos de Carga

Além de armazenar cargas úteis, o Qdrant também permite que você pesquise com base em certos tipos de valores. Essa funcionalidade é implementada como filtros adicionais durante o processo de pesquisa e permite incorporar lógica personalizada em cima da similaridade semântica.

Durante o processo de filtragem, o Qdrant verificará as condições dos valores que atendem aos critérios de filtro. Se o tipo de valor armazenado não atender aos critérios de filtro, ele será considerado insatisfatório.

Por exemplo, aplicar condições de intervalo a dados de strings resultará em uma saída vazia.

No entanto, o tratamento de arrays (múltiplos valores do mesmo tipo) é ligeiramente diferente. Quando aplicamos filtros a um array, se pelo menos um valor no array atender à condição, o filtro será bem-sucedido.

Uma discussão detalhada do processo de filtragem é realizada na seção de filtragem.

Vamos dar uma olhada nos tipos de dados suportados pelo Qdrant:

Inteiro

inteiro - inteiro de 64 bits, variando de -9223372036854775808 a 9223372036854775807.

Exemplos de valores inteiro únicos e múltiplos:

{
    "quantidade": 10,
    "tamanhos": [35, 36, 38]
}

Ponto Flutuante

ponto flutuante - número de ponto flutuante de 64 bits.

Exemplos de valores ponto flutuante únicos e múltiplos:

{
    "preço": 11,99,
    "classificação": [9,1, 9,2, 9,4]
}

Booleano

bool - valor binário. Igual a verdadeiro ou falso.

Exemplos de valores bool únicos e múltiplos:

{
    "entregue": verdadeiro,
    "respostas": [falso, falso, verdadeiro, falso]
}

Palavra-chave

palavra-chave - valor de string.

Exemplos de valores palavra-chave únicos e múltiplos:

{
    "nome": "Alice",
    "amigos": [
        "Bob",
        "Eva",
        "Jack"
    ]
}

Coordenadas Geográficas

geo é usado para representar coordenadas geográficas.

Exemplos de valores geo únicos e múltiplos:

{
    "localização": {
        "longitude": 52.5200,
        "latitude": 13.4050
    },
    "cidades": [
        {
            "longitude": 51.5072,
            "latitude": 0.1276
        },
        {
            "longitude": 40.7128,
            "latitude": 74.0060
        }
    ]
}

As coordenadas devem ser descritas como um objeto contendo dois campos: longitude - representando longitude, latitude - representando latitude.

Criando pontos com cargas úteis

API REST (arquitetura)

PUT /coleções/{nome_da_coleção}/pontos

{
    "pontos": [
        {
            "id": 1,
            "vetor": [0,05, 0,61, 0,76, 0,74],
            "carga útil": {"cidade": "Berlim", "preço": 1,99}
        },
        {
            "id": 2,
            "vetor": [0,19, 0,81, 0,75, 0,11],
            "carga útil": {"cidade": ["Berlim", "Londres"], "preço": 1,99}
        },
        {
            "id": 3,
            "vetor": [0,36, 0,55, 0,47, 0,94],
            "carga útil": {"cidade": ["Berlim", "Moscou"], "preço": [1,99, 2,99]}
        }
    ]
}

Definição de payloads

API REST (Esquema):

POST /coleções/{nome_da_coleção}/pontos/payload

{
    "payload": {
        "propriedade1": "string",
        "propriedade2": "string"
    },
    "pontos": [
        0, 3, 100
    ]
}

Exclusão de payloads

Este método remove as chaves de payload especificadas dos pontos especificados.

API REST (Esquema):

POST /coleções/{nome_da_coleção}/pontos/payload/delete

{
    "chaves": ["cor", "preço"],
    "pontos": [0, 3, 100]
}

Limpeza de payloads

Este método remove todas as chaves de payload dos pontos especificados.

API REST (Esquema):

POST /coleções/{nome_da_coleção}/pontos/payload/clear

{
    "pontos": [0, 3, 100]
}

Você também pode usar models.FilterSelector para remover pontos que correspondam a condições de filtro especificadas, em vez de fornecer IDs.

Indexação de Payload

Para realizar buscas filtradas de forma eficiente, o Qdrant permite criar um índice para campos de payload, especificando o nome e o tipo do campo.

Campos indexados também impactam o índice vetorial.

Na prática, é recomendável criar índices em campos que provavelmente restringirão mais os resultados. Por exemplo, a indexação no ID do objeto será mais eficiente do que a indexação na cor, pois o ID do objeto é único para cada registro, enquanto a cor tem apenas alguns valores possíveis.

Em consultas compostas envolvendo vários campos, o Qdrant tentará usar o índice mais restritivo primeiro.

Para criar um índice para um campo, pode-se usar o seguinte:

API REST (Esquema)

PUT /coleções/{nome_da_coleção}/índice

{
    "nome_do_campo": "nome do campo para indexar",
    "esquema_do_campo": "keyword"
}

Os campos indexados são exibidos no esquema de payload juntamente com o API de informações da coleção.

Exemplo de esquema de payload:

{
    "esquema_payload": {
        "propriedade1": {
            "tipo_de_dados": "keyword"
        },
        "propriedade2": {
            "tipo_de_dados": "integer"
        }
    }
}