As consultas de vetor operam pesquisando um banco de dados de vetor para encontrar os vetores que são mais adequados ao vetor de consulta em todo o cluster. Esta página mostra detalhes sobre como isso funciona.
Encontrar vetores semelhantes
As consultas de pesquisa vetorial usam duas estratégias:
- Vizinhos mais próximos (KNN): encontra os k vetores mais próximos do vetor de consulta.
- Vizinhos mais próximos aproximados (ANN): encontra os k vetores mais próximos do vetor de consulta.
Para usar a KNN, os índices precisam ser criados com o tipo de índice de vetor FLAT. Com a KNN, as consultas de pesquisa serão exatas, mas mais lentas. Para usar a ANN, os índices precisam ser criados com o tipo de índice de vetor HNSW. Com o ANN, as consultas de pesquisa serão aproximadas, mas mais rápidas. A precisão da ANN pode ser melhorada ajustando os parâmetros do índice HNSW e o parâmetro EF_RUNTIME na consulta.
Detalhamento da sintaxe da consulta
FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
index
: o nome do índice que contém o campo vetorial.(hybrid_filter_expression)
: é a expressão do filtro híbrido. Somente índices de tags e numéricos são aceitos em expressões de filtro. Consulte Consultas híbridas para mais detalhes sobre expressões de filtro.(*)
pode ser usado para realizar consultas que não exigem filtragem.
=>
: separa o filtro da pesquisa de vetor.[KNN num_neighbours @field $vector]
: a expressão de pesquisa KNN. Substituanum_neighbors
pelo número de resultados escolhido e@field
pelo nome do campo de vetor.PARAMS 2 my_vector_query_param "query_embedding"
:- O valor
2
apósPARAMS
indica que dois argumentos adicionais precisam ser fornecidos. my_vector_query_param
é o nome do vetor do parâmetro de consulta, conforme especificado na expressão de pesquisa da KNN.- Substitua
query_embedding
pelo vetor de consulta incorporado.
- O valor
DIALECT 2
: especifica que você está usando o dialeto de consulta versão 2 ou mais recente (necessário para a pesquisa vetorial).
Consultas híbridas
A expressão inicial entre parênteses () é uma expressão de filtro. As expressões de filtro permitem filtrar vetores durante a execução da pesquisa vetorial. Uma consulta que usa uma expressão de filtro para filtrar resultados é chamada de consulta híbrida. Qualquer combinação de tags e índices numéricos pode formar uma consulta híbrida.
O Memorystore para Valkey usa duas abordagens para filtrar pesquisas vetoriais:
- Pré-filtragem: depende de índices secundários (por exemplo, tag, numérica) para encontrar as correspondências com a expressão do filtro, independentemente da similaridade do vetor. Depois que os resultados filtrados são calculados, uma pesquisa de força bruta é realizada para classificar por similaridade de vetor.
- Filtragem inline: executa o algoritmo de pesquisa vetorial (por exemplo, HNSW), ignorando os vetores encontrados que não correspondem ao filtro.
A pré-filtragem é mais rápida quando o espaço de pesquisa filtrado é muito menor do que o original. Quando o espaço de pesquisa filtrado é grande, a filtragem inline fica mais rápida. O Memorystore para Valkey escolhe automaticamente entre as duas estratégias com base no filtro fornecido.
As expressões de filtro são compatíveis com índices numéricos e de tags.
Índice de tags
As tags são campos de texto que são interpretados como uma lista de tags delimitadas por um caractere de separação. Geralmente, as tags são pequenos conjuntos de valores com valores possíveis finitos, como cor, gênero de livro, nome da cidade ou autor.
- Somente campos indexados podem ser usados como filtro de tag.
- Os campos de TAG são tokenizados por um caractere de separação, que é uma vírgula "," por padrão, mas pode ser configurado durante a criação do índice.
- Nenhuma derivação é realizada durante a indexação de um campo de tag.
- Somente os pré-filtros exatos e de prefixo podem ser realizados em um campo de tag. Não é possível usar consultas de sufixo ou infixo.
- Por padrão, as tags não diferenciam maiúsculas de minúsculas. Por exemplo, "Azul" e "AZUL" serão indexados como "azul" e vão gerar o mesmo resultado em uma consulta híbrida.
- Strings vazias não são indexadas nem consultadas.
- Durante a indexação e consulta, todos os espaços em branco à direita são removidos.
Sintaxe
Aqui, {
e }
fazem parte da sintaxe, e |
é usado como um operador OR para oferecer suporte a várias tags:
@:{ | | ...}
Por exemplo, a consulta a seguir vai retornar documentos com a cor azul OU preta OU verde.
@color:{blue | black | green}
Como outro exemplo, a consulta a seguir vai retornar documentos que contêm "hello world" ou "hello universe".
@color:{hello world | hello universe}
Índice numérico
Os índices numéricos permitem que as consultas de filtragem retornem apenas valores entre um valor inicial e um valor final.
- Há suporte para consultas inclusivas e exclusivas.
- Para consultas abertas, +inf e -inf podem ser usados para expressar intervalos de início e fim.
Por exemplo, a consulta a seguir vai retornar livros publicados entre 2021 e 2024 (inclusive). A expressão matemática equivalente é 2021 <= year <= 2024
.
"@year:[2021 2024]"
A consulta a seguir vai retornar livros publicados entre 2021 (excluindo) e 2024 (inclusive). A expressão matemática equivalente é 2021 < year <= 2024
.
@year:[(2021 2024]
A consulta a seguir vai retornar livros publicados antes de 2024 (inclusive). A expressão matemática equivalente é year <= 2024
.
@year:[(-inf 2024]
A consulta a seguir vai retornar livros publicados após 2015 (exclusivo). A expressão matemática equivalente é year >= 2015
.
@year:[2015 +inf]
Use a tabela a seguir como um guia para mapear expressões matemáticas para consultas de pré-filtragem:
Expressão matemática | Expressão de filtro |
---|---|
min <= field <= max | @field:[min max] |
min < field <= max | @field:[(min max] |
min <= field < max | @field:[min (max] |
min < field < max | @field:[(min (max] |
field => min | @field:[min +inf] |
field > min | @field:[(min +inf] |
campo <= max | @field:[-inf max] |
campo < max | @field:[-inf (max] |
field == val | @field:[val val] |
Operadores lógicos
Várias tags e campos numéricos podem ser usadas para criar consultas complexas usando operadores lógicos.
Lógico AND
Para definir uma operação lógica E, use um espaço entre os predicados. Exemplo:
query1 query2 query3
Lógico OR
Para definir uma operação lógica OR, use o caractere '|' entre os predicados. Exemplo:
query1 | query2 | query3
Negação lógica
Qualquer consulta pode ser negada precedida por -
. As consultas negativas retornam todas as entradas que não correspondem à consulta. Isso também inclui documentos que não têm o campo.
Por exemplo, uma consulta negativa em @genre:{comedy}
vai retornar todos os livros que não são de comédia E todos os livros que não têm um campo de gênero.
A consulta a seguir vai retornar todos os livros com o gênero "comédia" que não foram publicados entre 2015 e 2024 ou que não têm um campo de ano:
@genre:[comedy] -@year:[2015 2024]
Exemplos de combinação de operadores lógicos
Os operadores lógicos podem ser combinados para formar expressões de filtro complexas.
A consulta a seguir vai retornar todos os livros com gênero "comédia" ou "terror" (AND) publicados entre 2015 e 2024:
@genre:[comedy|horror] @year:[2015 2024]
A consulta a seguir vai retornar todos os livros com gênero "comédia" ou "terror" (OR) publicados entre 2015 e 2024:
@genre:[comedy|horror] | @year:[2015 2024]
A consulta a seguir vai retornar todos os livros publicados entre 2015 e 2024 que não têm um campo de gênero ou têm um campo de gênero que não é igual a "comédia":
-@genre:[comedy] @year:[2015 2024]
Consulte as informações de FT.SEARCH para saber como usar.