As consultas de vetor funcionam pesquisando um banco de dados de vetores para encontrar aqueles que melhor correspondem ao vetor de consulta em todo o cluster. Esta página fornece detalhes sobre como isso funciona.
Encontrar vetores semelhantes
As consultas de pesquisa de vetor usam duas estratégias:
- Vizinhos k-mais próximos (KNN, na sigla em inglês): encontra os k vetores mais próximos do vetor de consulta.
- Vizinhos aproximados mais próximos (ANN, na sigla em inglês): encontra os k vetores mais próximos aproximados do vetor de consulta.
Para usar o KNN, os índices precisam ser criados com o tipo de índice de vetor FLAT. Com o KNN, as consultas de pesquisa serão exatas, mas mais lentas. Para usar o 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 acurácia do ANN pode ser melhorada ajustando os parâmetros do índice HNSW e o parâmetro EF_RUNTIME na consulta.
Detalhes 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 de vetor.(hybrid_filter_expression): essa é a expressão de filtro híbrido. Somente índices numéricos e de tag 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_neighborspelo número escolhido de resultados e@fieldpelo nome do campo de vetor.PARAMS 2 my_vector_query_param "query_embedding":- O valor
2apósPARAMSindica que dois argumentos extras precisam ser fornecidos. my_vector_query_paramé o nome do vetor de parâmetro de consulta, conforme especificado na expressão de pesquisa KNN.- Substitua
query_embeddingpelo vetor de consulta incorporado.
- O valor
DIALECT 2: especifica que você está usando a versão 2 ou mais recente do dialeto de consulta (necessário para a pesquisa de vetor).
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 de vetor. Uma consulta que usa uma expressão de filtro para filtrar resultados é chamada de consulta híbrida. Qualquer combinação de índices numéricos e de tag pode formar uma consulta híbrida.
O Memorystore para Valkey usa duas abordagens para filtrar pesquisas de vetor:
- Pré-filtragem: a pré-filtragem depende de índices secundários (por exemplo, tag, numérico) para encontrar primeiro as correspondências da expressão de 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: a filtragem inline executa o algoritmo de pesquisa de vetor (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 espaço de pesquisa original. Quando o espaço de pesquisa filtrado é grande, a filtragem inline se torna mais rápida. O Memorystore para Valkey escolhe automaticamente entre as duas estratégias com base no filtro fornecido.
As expressões de filtro oferecem suporte a índices numéricos e de tag.
Índice de tag
As tags são campos de texto interpretados como uma lista de tags delimitadas por um caractere separador. 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 um filtro de tag.
- Os campos TAG são tokenizados por um caractere separador, que é uma vírgula "," por padrão, mas configurável durante a criação do índice.
- Nenhum stemming é realizado ao indexar um campo de tag.
- Somente filtros de prefixo e pré-filtros exatos podem ser realizados em um campo de tag. Consultas de sufixo e infixo não são aceitas.
- Por padrão, as tags não diferenciam maiúsculas de minúsculas. Por exemplo, "Blue" e "BLUE" serão indexados como "blue" 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 a 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 cor azul, preta ou verde.
@color:{blue | black | green}
Como outro exemplo, a consulta a seguir vai retornar documentos que contenham "hello world" ou "hello universe".
@color:{hello world | hello universe}
Índice numérico
Os índices numéricos permitem filtrar consultas para retornar apenas valores que estejam entre um valor inicial e final.
- Consultas inclusivas e exclusivas são aceitas.
- Para consultas abertas, +inf, -inf podem ser usados para expressar intervalos inicial e final.
Como exemplo, a consulta a seguir vai retornar livros publicados entre 2021 e 2024 (ambos inclusivos). A expressão matemática equivalente é 2021 <= year <= 2024.
"@year:[2021 2024]"
A consulta a seguir vai retornar livros publicados entre 2021 (exclusivo) e 2024 (inclusivo). A expressão matemática equivalente é 2021 < year <= 2024.
@year:[(2021 2024]
A consulta a seguir vai retornar livros publicados antes de 2024 (inclusivo). 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] |
| field <= max | @field:[-inf max] |
| field < max | @field:[-inf (max] |
| field == val | @field:[val val] |
Operadores lógicos
Várias tags e campos numéricos podem ser usados para criar consultas complexas usando operadores lógicos.
Lógico AND
Para definir um AND lógico, use um espaço entre os predicados. Por exemplo:
query1 query2 query3
Lógico OR
Para definir um OR lógico, use o caractere "|" entre os predicados. Por exemplo:
query1 | query2 | query3
Negação lógica
Qualquer consulta pode ser negada ao adicionar - antes de cada consulta. 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 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" (E) 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" (OU) publicados entre 2015 e 2024:
@genre:[comedy|horror] | @year:[2015 2024]
A consulta a seguir vai retornar todos os livros que não têm um campo de gênero ou que têm um campo de gênero diferente de "comédia" e que foram publicados entre 2015 e 2024:
-@genre:[comedy] @year:[2015 2024]
Consulte as informações do FT.SEARCH para uso.