Todos os produtos
Search
Central de documentação

Elasticsearch:Use o recurso de busca kNN do Elasticsearch

Última atualização: Jun 27, 2026

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 knn

Sim

Defina index: true nos campos dense_vector

Busca kNN exata

Consulta script_score com uma função vetorial

Sim

Defina index: false ou deixe em branco

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_vector não oferecem suporte a agregação ou ordenação.

  • Campos do tipo nested não são compatíveis com busca kNN aproximada.

  • Em cenários de busca entre clusters, o parâmetro ccs_minimize_roundtrips não é compatível com a busca kNN.

  • A busca kNN usa o tipo de busca dfs_query_then_fetch por padrão. Não é possível definir explicitamente o parâmetro search_type ao 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

type

Defina como dense_vector.

dims

Número de dimensões por vetor. O máximo é 1.024 quando index: true e 2.048 quando index: false.

index

Defina como true para criar um índice HNSW para busca kNN aproximada. Padrão: false.

similarity

Algoritmo de similaridade usado para pontuar correspondências. Obrigatório quando index: true. Consulte a tabela abaixo.

Algoritmos de similaridade compatíveis

Valor

Algoritmo

Fórmula de pontuação

l2_norm

Distância euclidiana

1 / (1 + l2_norm(query, vector)^2)

dot_product (float)

Produto escalar — ambos os vetores devem ser normalizados para comprimento unitário

(1 + dot_product(query, vector)) / 2

dot_product (byte)

Produto escalar — ambos os vetores devem ter o mesmo comprimento

0.5 + (dot_product(query, vector) / (32768 × dims))

cosine

Similaridade de cosseno

(1 + cosine(query, vector)) / 2

Importante

O algoritmo cosine não aceita vetores com valor 0.

Nota

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

field

Sim

Nome do campo dense_vector a ser pesquisado.

query_vector

Sim

Vetor de consulta. Deve ter o mesmo número de dimensões do campo de destino.

k

Sim

Número de vizinhos mais próximos a retornar. Deve ser menor que num_candidates.

num_candidates

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.

filter

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

type

Defina como dense_vector.

dims

Número de dimensões por vetor.

index

Padrão: false. Defina como false ou deixe em branco para melhorar a eficiência da busca kNN exata.

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

cosineSimilarity

Similaridade de cosseno entre o vetor de consulta e o vetor do documento

dotProduct

Produto escalar do vetor de consulta e do vetor do documento

l1norm

Distância L1 (distância de Manhattan) entre o vetor de consulta e o vetor do documento

l2norm

Distância L2 (distância euclidiana) entre o vetor de consulta e o vetor do documento

Próximos passos