arquitetura

SurrealDB + Embeddings: Busca Semantica sem Servico Externo

17 de abril de 2026 4 min de leituraPor Autor
SurrealDB + Embeddings: Busca Semantica sem Servico Externo

O que e Busca Semantica?

Busca semantica vai alem de palavras-chave: encontra documentos por significado, nao por correspondencia exata. Um usuario que busca "como aprender programacao" encontra artigos sobre "introducao ao desenvolvimento de software" mesmo sem as palavras exatas.

A base tecnica sao embeddings — vetores numericos que representam o significado de um texto no espaco multidimensional.

SurrealDB v2 implementa indices HNSW (Hierarchical Navigable Small World) — o mesmo algoritmo usado em sistemas profissionais como Pinecone e Weaviate. Zero servico externo, zero custo adicional.

Schema: Adicionando Embeddings ao Article

DEFINE TABLE article SCHEMAFULL;

DEFINE FIELD slug               ON article TYPE string;
DEFINE FIELD title              ON article TYPE object;
DEFINE FIELD content            ON article TYPE object;
DEFINE FIELD content_embedding  ON article TYPE option<array<float>>
  COMMENT "Vetor 1536-dim gerado a partir do content.pt";

-- Indice HNSW para similaridade de cosseno
DEFINE INDEX idx_content_embedding ON article
  FIELDS content_embedding
  HNSW DIMENSION 1536
  DIST COSINE
  EFC 150 M 16;

Gerando Embeddings com Cloudflare AI

export async function generateEmbedding(
  text: string,
  ai: Ai
): Promise<number[]> {
  const result = await ai.run("@cf/baai/bge-base-en-v1.5", {
    text: [text.slice(0, 512)],
  })
  return result.data[0]
}

export async function updateArticleEmbedding(
  db: Surreal,
  ai: Ai,
  slug: string,
  contentPt: string
) {
  const embedding = await generateEmbedding(contentPt, ai)
  await db.query(
    "UPDATE article SET content_embedding = $emb WHERE slug = $slug",
    { emb: embedding, slug }
  )
}
O modelo @cf/baai/bge-base-en-v1.5 esta no plano free do Cloudflare AI. Para melhor precisao em portugues, use multilingual-e5-large (pago) ou a API da OpenAI com o modelo text-embedding-3-small.

Query de Artigos Relacionados por Similaridade

export async function listRelatedArticles(
  query: QueryFn,
  currentSlug: string,
  embedding: number[],
  limit = 3
): Promise<ArticleSummary[]> {
  const [rows] = await query<[ArticleSummary[]]>(
    `SELECT
        slug,
        title.pt AS title,
        excerpt.pt AS excerpt,
        category,
        tags,
        cover,
        author.name AS author_name,
        vector::similarity::cosine(content_embedding, $embedding) AS score
      FROM article
      WHERE content_embedding != NONE
        AND slug != $currentSlug
        AND status = "published"
      ORDER BY score DESC
      LIMIT $limit`,
    { embedding, currentSlug, limit }
  )
  return rows ?? []
}

Fluxo Completo de Publicacao

O fluxo ao publicar um artigo com embeddings:

  1. Gestor aprova artigo (status: published)
  2. Evento SurrealDB dispara webhook no Workers
  3. Worker chama Cloudflare AI para gerar embedding
  4. Embedding salvo no campo content_embedding
  5. Pagina /blog/:slug exibe artigos relacionados semanticamente
O indice nao funciona para artigos sem embedding. Apos inserir embeddings em massa, rode REBUILD INDEX idx_content_embedding ON article para reotimizar a estrutura HNSW. Para novos artigos, o indice e atualizado automaticamente.

Prompt para Gerar Metadados com IA

Analise o artigo abaixo e gere os metadados otimizados para SEO e busca semantica.

Retorne APENAS um JSON valido (sem markdown, sem explicacao):

Artigo: CONTEUDO_DO_ARTIGO

Conclusao

SurrealDB com HNSW transforma seu banco em motor de busca semantica sem servicos externos. Embeddings via Cloudflare AI ficam dentro da mesma infraestrutura, com custo zero no plano free. O resultado sao recomendacoes de conteudo verdadeiramente relevantes para cada leitor.

Escrito por

Autor

Autor(a) do Portal Marina Bernardi.

Continue lendo

Artigos relacionados

Discussão

0 comentários

Entre para participar
Faça login para comentar e interagir com outros alunos.
Voltar para o Blog