O Alibaba Cloud Elasticsearch V8.0 e versões posteriores oferecem suporte à busca por k-vizinhos mais próximos (kNN), que localiza os vetores mais semelhantes a um vetor de consulta. A busca kNN viabiliza casos de uso como:
Busca de imagens e fingerprinting de vídeo: encontre imagens visualmente semelhantes ou segmentos de vídeo quase duplicados.
Reconhecimento facial e de voz: compare vetores biométricos com perfis armazenados.
Recomendação de produtos: recupere itens cujos vetores de recursos estejam mais próximos do vetor de preferência do usuário.
Como funciona
Armazene seus dados como campos dense_vector em um índice do Elasticsearch. Ao executar uma busca kNN, o Elasticsearch calcula a similaridade entre o vetor de consulta e cada vetor de documento e retorna as k correspondências mais próximas.
Dois métodos de busca estão disponíveis:
|
Método de busca |
Interface de consulta |
Armazenamento em memória |
Requisito de mapeamento |
|
Busca kNN aproximada |
Search API com parâmetros |
Sim |
Defina |
|
Busca kNN exata |
Consulta |
Sim |
Defina |
Na maioria dos casos, use a busca kNN aproximada. Ela retorna resultados com menor latência, embora com uma leve redução na precisão. A busca kNN exata garante resultados precisos, mas executa uma varredura por força bruta em todos os documentos correspondentes, não sendo adequada para conjuntos de dados de grande escala.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster do Alibaba Cloud Elasticsearch V8.x. Este guia usa a V8.5.1 como exemplo. Para instruções de configuração, consulte Criar um cluster do Alibaba Cloud Elasticsearch.
Dados de negócios convertidos em representações vetoriais e armazenados em campos
dense_vector. Projete seus vetores de modo que documentos mais semelhantes a uma consulta tenham vetores mais próximos do vetor de consulta, com base na métrica de similaridade escolhida.
Observações de uso
Campos
dense_vectornão oferecem suporte a agregação ou ordenação.Campos do tipo
nestednão são compatíveis com busca kNN aproximada.Em cenários de busca entre clusters, o parâmetro
ccs_minimize_roundtripsnão é compatível com a busca kNN.A busca kNN usa o tipo de busca
dfs_query_then_fetchpor padrão. Não é possível definir explicitamente o parâmetrosearch_typeao executar uma busca kNN.
Busca kNN aproximada
Considerações de desempenho
A busca kNN aproximada usa grafos Hierarchical Navigable Small World (HNSW) para indexar vetores densos por segmento. A construção de grafos HNSW durante a indexação consome muitos recursos. Para manter o desempenho estável:
Aumente o tempo limite do cliente e use solicitações de gravação em massa ao indexar dados vetoriais.
Reduza o número de segmentos ou consolide todos em um único segmento para melhorar a velocidade de busca.
Garanta que a memória do nó de dados seja superior ao tamanho combinado de todos os dados vetoriais e das estruturas de índice HNSW.
Evite operações grandes de gravação ou atualização enquanto uma busca kNN aproximada estiver em execução.
Crie um índice
Defina index: true e configure o parâmetro similarity ao definir campos dense_vector.
PUT image-index
{
"mappings": {
"properties": {
"image-vector": {
"type": "dense_vector",
"dims": 3,
"index": true,
"similarity": "l2_norm"
},
"title": {
"type": "text"
},
"file-type": {
"type": "keyword"
}
}
}
}
Parâmetros do campo dense_vector
Para a referência completa de parâmetros, consulte dense-vector.
|
Parâmetro |
Descrição |
|
|
Defina como |
|
|
Número de dimensões por vetor. O máximo é 1.024 quando |
|
|
Defina como |
|
|
Algoritmo de similaridade usado para pontuar correspondências. Obrigatório quando |
Algoritmos de similaridade compatíveis
|
Valor |
Algoritmo |
Fórmula de pontuação |
|
|
Distância euclidiana |
|
|
|
Produto escalar — ambos os vetores devem ser normalizados para comprimento unitário |
|
|
|
Produto escalar — ambos os vetores devem ter o mesmo comprimento |
|
|
|
Similaridade de cosseno |
|
O algoritmo cosine não aceita vetores com valor 0.
A busca kNN aproximada é compatível com o Elasticsearch V8.0 e versões posteriores. Se o seu cluster foi atualizado de uma versão anterior à V8.0, recrie o índice e defina index: true em quaisquer campos dense_vector antes de executar buscas kNN aproximadas.
Gravar dados
POST image-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "image-vector": [1, 5, -20], "title": "moose family", "file-type": "jpg" }
{ "index": { "_id": "2" } }
{ "image-vector": [42, 8, -15], "title": "alpine lake", "file-type": "png" }
{ "index": { "_id": "3" } }
{ "image-vector": [15, 11, 23], "title": "full moon", "file-type": "jpg" }
Execute uma busca kNN aproximada
Use o parâmetro knn na Search API. A API de busca kNN foi descontinuada no Elasticsearch V8.4 e versões posteriores.
POST image-index/_search
{
"knn": {
"field": "image-vector",
"query_vector": [-5, 9, -12],
"k": 10,
"num_candidates": 100
},
"fields": [ "title", "file-type" ]
}
Parâmetros da busca kNN
Para a referência completa de parâmetros, consulte Search API.
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Nome do campo |
|
|
Sim |
Vetor de consulta. Deve ter o mesmo número de dimensões do campo de destino. |
|
|
Sim |
Número de vizinhos mais próximos a retornar. Deve ser menor que |
|
|
Sim |
Número de candidatos a vizinhos mais próximos avaliados por shard. Máximo: 10.000. Um valor maior melhora a precisão, mas aumenta a latência. |
|
|
Não |
Filtro Query DSL aplicado durante a busca. Retorna os k principais documentos que correspondem ao filtro. Se omitido, todos os documentos serão considerados. |
Busca kNN exata
Crie um índice
Defina index: false (ou deixe em branco) para ignorar a criação de um índice HNSW.
PUT zl-index
{
"mappings": {
"properties": {
"product-vector": {
"type": "dense_vector",
"dims": 5,
"index": false
},
"price": {
"type": "long"
}
}
}
}
|
Parâmetro |
Descrição |
|
|
Defina como |
|
|
Número de dimensões por vetor. |
|
|
Padrão: |
Gravar dados
POST zl-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "product-vector": [230.0, 300.33, -34.8988, 15.555, -200.0], "price": 1599 }
{ "index": { "_id": "2" } }
{ "product-vector": [-0.5, 100.0, -13.0, 14.8, -156.0], "price": 799 }
{ "index": { "_id": "3" } }
{ "product-vector": [0.5, 111.3, -13.0, 14.8, -156.0], "price": 1099 }
Execute uma busca kNN exata
Use a consulta script_score com uma função vetorial. O exemplo abaixo usa cosineSimilarity e aplica um filtro para limitar os documentos avaliados pela função vetorial. Reduzir o número de documentos verificados melhora o desempenho.
POST zl-index/_search
{
"query": {
"script_score": {
"query": {
"bool": {
"filter": {
"range": {
"price": {
"gte": 1000
}
}
}
}
},
"script": {
"source": "cosineSimilarity(params.queryVector, 'product-vector') + 1.0",
"params": {
"queryVector": [-0.5, 90.0, -10, 14.8, -156.0]
}
}
}
}
}
Funções vetoriais compatíveis
Para a referência completa de funções, consulte Functions for vector fields.
|
Função |
Descrição |
|
Similaridade de cosseno entre o vetor de consulta e o vetor do documento |
|
|
Produto escalar do vetor de consulta e do vetor do documento |
|
|
Distância L1 (distância de Manhattan) entre o vetor de consulta e o vetor do documento |
|
|
Distância L2 (distância euclidiana) entre o vetor de consulta e o vetor do documento |
Próximos passos
Busca por k-vizinhos mais próximos (kNN) — documentação de referência do Elasticsearch