DEV Community

Cover image for Python + OpenSearch: Como Criar um Motor de Busca Poderoso
Francisco Júnior
Francisco Júnior

Posted on

Python + OpenSearch: Como Criar um Motor de Busca Poderoso

Se você trabalha com bancos de dados relacionais ou análise de dados, já deve ter passado por isso: você precisa criar um campo de busca para os usuários encontrarem produtos, textos ou logs.

A primeira intuição é ir para o bom e velho SQL:
SELECT * FROM tabela WHERE descricao LIKE '%termo_de_busca%';

O problema? Isso é lento, consome muito processamento em tabelas gigantes (como no BigQuery ou PostgreSQL) e, pior de tudo, é burro. Se o usuário digitar "notbook" em vez de "notebook", o SQL não retorna nada.

Para resolver isso de forma inteligente e escalável, apresento a você o OpenSearch.

O que é o OpenSearch? (A explicação rápida)

O OpenSearch é um motor de busca e análise de dados distribuído, de código aberto (criado pela AWS como um fork do Elasticsearch).

Em vez de ler linha por linha como um banco SQL tradicional, ele usa uma estrutura chamada Índice Invertido (Inverted Index).

Imagine o índice de um livro físico: em vez de folhear o livro inteiro procurando a palavra "Python", você vai ao índice no final do livro, acha a palavra "Python" e ele te diz exatamente em quais páginas ela aparece. O OpenSearch faz isso em milissegundos, mesmo com terabytes de dados.

Passo 1: Subindo o OpenSearch localmente 🐳

Para não instalar nada direto na sua máquina (especialmente se você está configurando seu ambiente no macOS), vamos usar contêineres. Novamente, você pode usar o OrbStack (ou Docker) para rodar o OpenSearch em segundos.

Vamos rodar uma versão de desenvolvimento (com um único nó e segurança desativada apenas para facilitar nosso teste local):

docker run -d --name opensearch-local \
  -p 9200:9200 -p 9600:9600 \
  -e "discovery.type=single-node" \
  -e "DISABLE_SECURITY_PLUGIN=true" \
  opensearchproject/opensearch:latest

Enter fullscreen mode Exit fullscreen mode

Agora, vamos usar o uv para instalar o cliente oficial no Python:

uv pip install opensearch-py

Enter fullscreen mode Exit fullscreen mode

Passo 2: A Conexão Python 🐍

Vamos criar nosso script busca.py e conectar ao nosso cluster local.

from opensearchpy import OpenSearch

# Configurando a conexão
cliente = OpenSearch(
    hosts=[{'host': 'localhost', 'port': 9200}],
    http_compress=True, # Habilita compressão para respostas mais rápidas
    use_ssl=False,      # Desativado para nosso ambiente local
    verify_certs=False
)

# Testando se estamos online
info = cliente.info()
print(f"Conectado ao OpenSearch! Versão: {info['version']['number']}")

Enter fullscreen mode Exit fullscreen mode

Passo 3: Criando o Índice e Inserindo Dados (Indexação) 🗂️

No OpenSearch, não temos "tabelas" e "linhas". Temos Índices e Documentos (que são basicamente arquivos JSON).

Vamos criar um índice de perfis profissionais e indexar alguns dados:

nome_indice = 'profissionais_dados'

# 1. Cria o índice (se não existir)
if not cliente.indices.exists(index=nome_indice):
    cliente.indices.create(index=nome_indice)
    print(f"Índice '{nome_indice}' criado!")

# 2. Nossos dados em formato de dicionário (JSON)
documentos = [
    {"id": 1, "nome": "Francisco", "cargo": "Analista de Dados", "habilidades": ["Python", "SQL", "BigQuery", "BI"]},
    {"id": 2, "nome": "Larissa", "cargo": "Engenheira de Software", "habilidades": ["Java", "Spring", "PostgreSQL"]},
    {"id": 3, "nome": "Angelo", "cargo": "Coordenador de Operações", "habilidades": ["Processos", "Gestão", "Excel", "BI"]},
]

# 3. Inserindo (Indexando) os documentos
for doc in documentos:
    cliente.index(
        index=nome_indice,
        body=doc,
        id=doc["id"],
        refresh=True # Força a atualização imediata para podermos buscar logo em seguida
    )
print("Documentos indexados com sucesso!")

Enter fullscreen mode Exit fullscreen mode

Passo 4: A Mágica da Busca (Full-Text Search) ⚡

Aqui é onde o OpenSearch destrói o SQL. Vamos fazer uma busca que não apenas acha resultados exatos, mas calcula a relevância (o famoso score).

# O que o usuário digitou na barra de busca:
termo_busca = "analista bi python"

# Construindo a query (A DSL do OpenSearch)
query = {
    "query": {
        "multi_match": {
            "query": termo_busca,
            "fields": ["cargo", "habilidades"], # Onde queremos procurar
            "fuzziness": "AUTO" # Aqui está a mágica: perdoa erros de digitação!
        }
    }
}

# Executando a busca
resposta = cliente.search(body=query, index=nome_indice)

print(f"\nResultados encontrados: {resposta['hits']['total']['value']}")

# Iterando sobre os resultados ordenados por relevância
for hit in resposta['hits']['hits']:
    score = hit['_score'] # Pontuação de relevância
    dado = hit['_source'] # O documento original

    print(f"[Score: {score}] {dado['nome']} - {dado['cargo']} | Skills: {dado['habilidades']}")

Enter fullscreen mode Exit fullscreen mode

Por que isso é incrível?
Mesmo que o termo seja "analista bi python", o OpenSearch vai encontrar o documento 1 (que tem "Analista" no cargo e "BI" e "Python" nas habilidades) e dar a ele uma pontuação alta. Ele entende o contexto das palavras nos campos que você determinou, algo que daria muita dor de cabeça para replicar em SQL puro.


Boas Práticas para o dia a dia

  1. Mapeamento (Mapping): No nosso exemplo, o OpenSearch adivinhou os tipos de dados (String, Array, etc). Em produção, defina o Mapping antes de inserir dados para otimizar o armazenamento.
  2. Dashboards: O OpenSearch vem com o OpenSearch Dashboards (antigo Kibana). Se você gosta de Business Intelligence, pode plugar ele no seu índice e criar gráficos em tempo real dos seus dados sem escrever uma linha de código.
  3. Logs de Aplicação: Se sua aplicação Python gera muitos logs, mande-os para o OpenSearch. É o padrão da indústria para debugar erros complexos de forma visual.

Conclusão

O OpenSearch tira o peso do seu banco de dados principal e entrega uma experiência de busca de nível Google ou Amazon para os seus usuários. Integrar isso com Python é simples, rápido e eleva absurdamente o nível da arquitetura dos seus projetos.


Você já conhecia a diferença entre Índices Invertidos e buscas SQL tradicionais? Comenta aqui embaixo!

Top comments (0)