As consultas vetoriais funcionam pesquisando numa base de dados vetorial para encontrar vetores que melhor correspondam ao seu vetor de consulta. Esta página fornece detalhes sobre como funciona.
Encontrar vetores semelhantes
As consultas de pesquisa vetorial usam duas estratégias:
- K-Nearest Neighbors (KNN): encontra os k vetores mais próximos do seu vetor de consulta.
- Vizinhos mais próximos aproximados (ANN): encontra os k vetores mais próximos aproximados do seu vetor de consulta
Para usar a KNN, os índices devem ser criados com o tipo de índice de vetor FLAT. Com a KNN, as consultas de pesquisa são exatas, mas mais lentas. Para usar a ANN, os índices devem ser criados com o tipo de índice de vetor HNSW. Com a RAA, as consultas de pesquisa sã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.
Discriminação da sintaxe de 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 seu campo vetorial.(hybrid_filter_expression)
: esta é a expressão de filtro híbrida. Apenas os índices numéricos e de etiquetas são suportados em expressões de filtro. Consulte o artigo Consultas híbridas para ver mais detalhes sobre as expressões de filtro.(*)
pode ser usado para executar consultas que não requerem filtragem.
=>
: separa o filtro da pesquisa vetorial.[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 vetorial.PARAMS 2 my_vector_query_param "query_embedding"
:- O valor
2
apósPARAMS
indica que têm de ser fornecidos dois argumentos adicionais. my_vector_query_param
é o nome do vetor do parâmetro de consulta, conforme especificado na expressão de pesquisa KNN.- Substitua
query_embedding
pelo seu vetor de consulta incorporado.
- O valor
DIALECT 2
: especifica que está a usar a versão 2 ou posterior do dialeto de consulta (obrigatório para a pesquisa vetorial).
Consultas híbridas
A expressão inicial incluída entre parênteses () é uma expressão de filtro. As expressões de filtro permitem-lhe filtrar vetores durante a execução da pesquisa vetorial. Uma consulta que usa uma expressão de filtro para filtrar os resultados é denominada consulta híbrida. Qualquer combinação de etiquetas e índices numéricos pode formar uma consulta híbrida.
O Memorystore for Redis usa duas abordagens para filtrar pesquisas vetoriais:
- Pré-filtragem: a pré-filtragem baseia-se em índices secundários (por exemplo, etiqueta, numérico) para encontrar primeiro as correspondências com a expressão de filtro, independentemente da semelhança vetorial. Depois de calcular os resultados filtrados, é realizada uma pesquisa de força bruta para ordenar por semelhança vetorial.
- Filtragem inline: a 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 espaço de pesquisa original. Quando o espaço de pesquisa filtrado é grande, a filtragem inline torna-se mais rápida. O Memorystore for Redis escolhe automaticamente entre as duas estratégias com base no filtro fornecido.
As expressões de filtro suportam índices numéricos e de etiquetas.
Índice de etiquetas
As etiquetas são campos de texto que são interpretados como uma lista de etiquetas delimitadas por um caráter separador. Geralmente, as etiquetas são pequenos conjuntos de valores com valores possíveis finitos, como cor, género de livro, nome da cidade ou autor.
- Só é possível usar campos indexados como filtro de etiquetas.
- Os campos TAG são tokenizados por um caráter separador, que é uma vírgula "," por predefinição, mas configurável durante a criação do índice.
- Não é feita nenhuma derivação durante a indexação de um campo de etiqueta.
- Só é possível aplicar prefixos e pré-filtros exatos a um campo de etiqueta. Os sufixos e os infixos não são suportados.
- Por predefinição, as etiquetas não são sensíveis a maiúsculas e minúsculas. Por exemplo, "Azul" e "AZUL" são indexados como "azul" e produzem o mesmo resultado numa consulta híbrida.
- As 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 suportar várias etiquetas:
@:{ | | ...}
Por exemplo, a seguinte consulta devolve documentos com a cor azul OU preto OU verde.
@color:{blue | black | green}
Como outro exemplo, a seguinte consulta devolve documentos que contêm "hello world" ou "hello universe"
@color:{hello world | hello universe}
Índice numérico
Os índices numéricos permitem filtrar consultas para devolver apenas valores que estejam entre um determinado valor inicial e final.
- São suportadas consultas inclusivas e exclusivas.
- Para consultas de resposta aberta, pode usar +inf e -inf para expressar intervalos de início e fim.
Por exemplo, a seguinte consulta devolve livros publicados entre 2021 e 2024 (inclusive). A expressão matemática equivalente é 2021 <= year <= 2024
.
"@year:[2021 2024]"
A seguinte consulta devolve livros publicados entre 2021 (exclusive) e 2024 (inclusive). A expressão matemática equivalente é 2021 < year <= 2024
.
@year:[(2021 2024]
A seguinte consulta devolve livros publicados antes de 2024 (inclusive). A expressão matemática equivalente é year <= 2024
.
@year:[(-inf 2024]
A seguinte consulta devolve livros publicados após 2015 (exclusivo). A expressão matemática equivalente é year >= 2015
.
@year:[2015 +inf]
Use a tabela seguinte 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 < campo <= max | @field:[(min max] |
min <= field < max | @field:[min (max] |
min < campo < max | @field:[(min (max] |
field => min | @field:[min +inf] |
campo > min | @field:[(min +inf] |
campo <= máx. | @field:[-inf max] |
campo < máximo | @field:[-inf (max] |
field == val | @field:[val val] |
Operadores lógicos
Podem ser usadas várias etiquetas e campos numéricos para criar consultas complexas através de operadores lógicos.
E lógico
Para definir um E lógico, use um espaço entre os predicados. Por exemplo:
query1 query2 query3
OU lógico
Para definir um OR lógico, use o caráter "|" entre os predicados. Por exemplo:
query1 | query2 | query3
Negação lógica
Qualquer consulta pode ser negada adicionando -
antes de cada consulta. As consultas negativas devolvem todas as entradas que não correspondem à consulta. Isto também inclui documentos que não têm o campo.
Por exemplo, uma consulta negativa em @genre:{comedy}
devolve 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 seguinte consulta devolve todos os livros do 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 seguinte consulta devolve todos os livros com o género "comédia" ou "terror" (E) publicados entre 2015 e 2024:
@genre:[comedy|horror] @year:[2015 2024]
A seguinte consulta devolve todos os livros com o género "comédia" ou "terror" (OU) publicados entre 2015 e 2024:
@genre:[comedy|horror] | @year:[2015 2024]
A seguinte consulta devolve 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 de FT.SEARCH para ver a utilização.