Sintaxe das consultas

As consultas de vetor pesquisam um banco de dados de vetores para encontrar aqueles que melhor correspondem ao vetor de consulta em todo o cluster. Esta página traz detalhes sobre como isso 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 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 a ANN, os índices precisam ser criados com o tipo de índice de vetor HNSW. Com a ANN, as consultas de pesquisa serão aproximadas, mas mais rápidas. A acurácia da ANN pode ser melhorada ajustando os parâmetros do índice HNSW e o parâmetro EF_RUNTIME na consulta.

Detalhamento 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 seu campo de vetor.

  • (hybrid_filter_expression): essa é a expressão de filtro híbrido. Somente tags e índices 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 expressão de pesquisa de vetor.

  • [KNN num_neighbours @field $vector]: a expressão de pesquisa de KNN. Substitua num_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ós PARAMS indica 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 de KNN.
    • Substitua query_embedding pelo seu vetor de consulta incorporado.
  • DIALECT 2: especifica que você está usando a versão 2 ou mais recente do dialeto de consulta (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 expressão de 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 for Redis Cluster usa duas abordagens para filtrar expressões de pesquisa de vetores:

  1. 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 de vetores. Depois que os resultados filtrados são calculados, uma pesquisa de força bruta é realizada para classificar por similaridade de vetor.
  2. 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 original. Quando o espaço de pesquisa filtrado é grande, a filtragem inline fica mais rápida. O Memorystore for Redis Cluster escolhe automaticamente entre as duas estratégias com base no filtro fornecido.

As expressões de filtro são compatíveis com tags e índices numéricos.

Índice de tags

As tags são campos de texto interpretados como uma lista de tags delimitadas por um caractere separador. Em geral, as tags são pequenos conjuntos de valores com possibilidades finitas, 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 pode ser configurado durante a criação do índice.
  • Nenhum stemming é realizado ao indexar um campo de tag.
  • Somente prefixos e pré-filtros exatos podem ser usados em um campo de tag. Consultas de sufixo e infixo não são compatíveis.
  • 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 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 as cores azul, preto 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 estão entre um valor inicial e final especificados.

  • Consultas inclusivas e exclusivas são aceitas.
  • Para consultas abertas, +inf e -inf podem ser usados para expressar intervalos de início e fim.

Por exemplo, a consulta a seguir retorna 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 (exclusivo) e 2024 (inclusivo). A expressão matemática equivalente é 2021 < year <= 2024.

@year:[(2021 2024]

A consulta a seguir retorna 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 depois de 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 em consultas de pré-filtragem:

Expressão matemática Expressão de filtro
min <= campo <= max @field:[min max]
min < campo <= max @field:[(min max]
min <= campo < max @field:[min (max]
min < campo < 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

É possível usar várias tags e campos numéricos para criar consultas complexas com operadores lógicos.

Lógico AND

Para definir um AND lógico, use um espaço entre os predicados. Exemplo:

query1 query2 query3
Lógico OR

Para definir um OR lógico, use o caractere "|" entre os predicados. Exemplo:

query1 | query2 | query3
Negação lógica

Qualquer consulta pode ser negada adicionando - antes de cada uma. 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 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 consulta a seguir vai retornar todos os livros dos gêneros "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 dos gêneros "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 que não têm um campo de gênero ou 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 saber como usar.