Global Search para Power BI — Detalhamento Técnico
Artigo para blog técnico, público: desenvolvedores, analistas e arquitetos de dados que trabalham com Power BI.
O problema real: busca transversal em modelos dimensionais
Relatórios Power BI crescem em complexidade proporcional ao amadurecimento do modelo de dados. Um modelo estrela bem projetado pode facilmente ter 15, 20 ou mais dimensões relevantes para o usuário final: clientes, produtos, regiões, categorias, status, representantes, centros de custo, referências internas e SKUs.
O problema não é o modelo. O problema é que o Power BI não oferece, nativamente, um mecanismo de busca transversal entre colunas de tabelas distintas. O usuário precisa conhecer a estrutura do modelo para saber onde procurar um dado específico.
O que existe nativamente
O Power BI oferece o campo de busca interno do painel de filtros, mas ele opera dentro de um único campo por vez e não é exposto como elemento de UI no canvas do relatório. O slicer nativo tem busca textual, mas é igualmente restrito a uma única coluna.
As gambiarras mais comuns, e seus custos reais
Quando um desenvolvedor precisa simular busca multi-campo no Power BI sem um visual dedicado, os caminhos mais utilizados são:
1. Pilha de slicers com busca individual A abordagem mais simples: um slicer por coluna relevante, todos com o campo de busca habilitado. Funciona para dois ou três campos. A partir daí, passa a ocupar espaço excessivo no canvas, obriga o usuário a saber em qual slicer procurar e não oferece uma experiência unificada.
2. Field Parameters + DAX + Bookmarks A abordagem considerada mais “correta” para quem busca dinamismo. O fluxo típico é:
- Criar um Field Parameter que agrupa as colunas pesquisáveis
- Escrever medidas DAX de filtragem dinâmica baseadas na seleção do parâmetro
- Criar um slicer sobre o parâmetro para o usuário escolher qual campo deseja pesquisar
- Adicionar um segundo slicer (ou campo de texto via Q&A) para o valor
- Amarrar tudo com bookmarks e botões de navegação para criar a ilusão de uma experiência unificada
O resultado costuma ser frágil. Qualquer renomeação de tabela ou coluna pode quebrar as medidas DAX. A manutenção se torna cara. A experiência ainda não é de busca livre, pois o usuário continua precisando escolher o campo antes de digitar o valor.
3. Unpivot no Power Query Outra abordagem que aparece com frequência é usar o Power Query para fazer o unpivot das colunas pesquisáveis em uma tabela atributo-valor, consolidando tudo em uma única coluna “Valor”, acompanhada por uma coluna “Campo”.
O problema é estrutural: o unpivot desnormaliza o modelo. O volume de linhas pode explodir (N colunas × M linhas originais). Relacionamentos com outras tabelas precisam ser refeitos ou duplicados. Medidas que dependem da granularidade original deixam de funcionar corretamente. É uma solução de busca que compromete a integridade do modelo.
4. Q&A Visual O visual de Perguntas e Respostas do Power BI utiliza linguagem natural, mas depende de sinônimos configurados manualmente, tem comportamento imprevisível em português e não oferece controle sobre quais campos serão pesquisados. Não é adequado para ambientes corporativos que exigem previsibilidade.
O que o Global Search faz de diferente
O Global Search é um visual que resolve o problema de busca transversal de forma direta, sem alterar o modelo de dados e sem exigir DAX adicional.
Arquitetura de filtros
O visual recebe até 25 colunas por meio de um único data role (searchFields, do tipo Grouping). Em cada ciclo de update(), ele lê as linhas da tabela achatada (dataView.table.rows) e indexa os valores únicos por coluna.
A aplicação de filtros é feita por meio da API IVisualHost.applyJsonFilter, utilizando BasicFilter com operador In, ou seja, um filtro por coluna ativa. Isso significa que os filtros se propagam pelo modelo como qualquer outro filtro do Power BI, respeitando relacionamentos, segurança em nível de linha (RLS) e todos os visuais da página.
Desacoplamento de nome de tabela
Um detalhe crítico de implementação é que o Power BI congela o queryName de cada coluna no momento do binding. Se o usuário renomear a tabela no modelo após conectar os campos, o queryName fica desatualizado e os filtros deixam de funcionar silenciosamente.
O Global Search resolve isso utilizando col.expr como fonte de verdade:
const expr = (col as any).expr;
const tableName = expr?.source?.entity || col.queryName?.split('.')[0];
const columnName = expr?.ref || col.queryName?.split('.')[1];
A cada update(), o visual compara os campos ativos com os filtros aplicados, detecta renomeações automaticamente e reaplica os filtros com os nomes corretos, sem intervenção do usuário.
Modos de busca
Configuráveis no Format Pane:
| Modo | Comportamento |
|---|---|
| Contains | Corresponde a qualquer posição do valor (padrão) |
| Starts With | Corresponde apenas ao início do valor |
| Equals | Correspondência exata |
Além do modo, o desenvolvedor pode configurar independentemente:
- Ignore Accents — normaliza caracteres Unicode antes da comparação (
é=e) - Case Sensitive — diferencia maiúsculas e minúsculas (desativado por padrão)
Sugestões agrupadas por campo
O dropdown exibe os resultados organizados por coluna de origem, com um cabeçalho de grupo mostrando o nome do campo e um contador X de Y (traduzido conforme o idioma configurado). Cada grupo possui um botão “Selecionar todos”, que aplica todos os valores visíveis daquele campo com um único clique, equivalente a realizar Ctrl+Click em cada item individualmente.
Filtros ativos como tags
Os filtros aplicados aparecem como tags removíveis abaixo do campo de busca. Cada tag pode exibir opcionalmente o nome do campo de origem (showFieldName), permitindo que o usuário entenda de onde veio cada filtro e os remova individualmente ou todos de uma vez.
Performance
O visual opera inteiramente no lado cliente, sem chamadas externas. A indexação dos valores é feita na chegada dos dados (update()), e a filtragem das sugestões é síncrona, garantindo resposta imediata ao digitar.
O Format Pane expõe uma opção de Show Metrics (diagnóstico), que exibe o tempo de processamento e o volume de dados indexados, algo útil durante o desenvolvimento do relatório.
O dataReductionAlgorithm está configurado para até 50.000 linhas por query, suficiente para a maioria dos cenários de lookup, com carregamento de + 50.000 por demanda.
Acessibilidade
- Navegação completa por teclado:
Tabpara mover entre elementos,Enterpara selecionar eEscapepara fechar o dropdown - Atributos ARIA em todos os elementos interativos:
role,aria-label,aria-expanded,aria-selectedearia-livepara anúncios dinâmicos - Labels traduzidos conforme o idioma configurado
- Contraste configurável via Format Pane
Internacionalização
Três idiomas são suportados: Português (BR), Inglês e Espanhol. A detecção é automática via navigator.language, com possibilidade de override manual no Format Pane. Todas as strings de UI são externalizadas, sem textos hardcoded no código de renderização.
Personalização via Format Pane
O visual expõe um conjunto amplo de propriedades nativas do Power BI, sem necessidade de configurações externas.
Search Box: cor de fundo, cor do texto, cor da borda (padrão e foco), tamanho e família de fonte, border radius, altura, ícone de busca (cor, tamanho e visibilidade) e botão de limpar (tamanho).
Suggestions Dropdown: cor e tamanho de fonte dos itens, cor de fundo do cabeçalho, cor do texto do cabeçalho, cor de hover, cor de highlight do match, altura máxima do dropdown, máximo de resultados por campo e tamanho de fonte dos labels de grupo.
Filter Tags: cor de fundo, cor do texto, tamanho de fonte e exibição do nome do campo.
Temas pré-definidos: Black & White, Red, Blue, Mustard e Green. Cada tema aplica um conjunto coerente de tokens de cor com um único clique, podendo ser refinado posteriormente propriedade por propriedade.
Comparativo com outros visuais do mercado
A tabela abaixo compara o Global Search com alternativas disponíveis no AppSource que abordam busca ou filtragem textual.
| Recurso | Global Search | Slicer Nativo | Smart Filter Pro (OKViz) | Advanced Slicer (xViz) | Q&A Visual |
|---|---|---|---|---|---|
| Busca em múltiplos campos simultâneos | Sim (até 25) | Não | Não (1 por instância) | Não (1 por instância) | Parcial |
| Sugestões agrupadas por campo | Sim | Não | Não | Não | Não |
| Selecionar todos por grupo | Sim | Não | Não | Não | Não |
| Filtros ativos visíveis como tags | Sim | Não | Sim | Sim | Não |
| Modos de busca configuráveis | Sim (3 modos) | Não | Parcial | Parcial | Não |
| Normalização de acentos | Sim | Não | Não | Não | Não |
| Acessibilidade ARIA + teclado | Completa | Parcial | Parcial | Parcial | Parcial |
| Internacionalização (PT/EN/ES) | Sim | Não | Não | Não | Não |
| Personalização granular via Format Pane | Alta | Baixa | Média | Média | Baixa |
| Temas pré-definidos | Sim (5) | Não | Não | Não | Não |
| Métricas de performance (diagnóstico) | Sim | Não | Não | Não | Não |
| Sem coleta de dados | Sim | N/A | Não confirmado | Não confirmado | N/A |
| Gratuito sem restrições | Sim | Sim | Não (pago) | Não (pago) | N/A |
Informações sobre visuais de terceiros baseadas em documentação pública disponível no AppSource e nos sites dos fornecedores. Sujeitas a mudanças com atualizações dos produtos.
O que vem pela frente
Funcionalidades documentadas e em avaliação para próximas versões.
Busca multi-token com ;
Permitir que o usuário digite produto;2026 e aplique os dois termos como filtros em cascata. Cada token restringe o contexto do próximo. A lógica de cascata já existe na arquitetura atual e esta funcionalidade é uma extensão do pipeline de filtragem.
Dropdown ao focar sem digitar
Ao clicar no campo sem digitar, exibir todos os valores únicos agrupados por campo, como um select nativo. Trata-se de uma extensão direta do renderSuggestions(), tratando query vazia como “mostrar tudo”, com um limite configurável separado do maxResults de busca.
Ícones de tipo de campo
O fieldType já é detectado e armazenado em cada FieldData e Suggestion. A implementação é apenas de renderização: adicionar o ícone (Aa, 123, calendário) no HTML de cada sugestão. A pendência está na detecção confiável de datas, pois o campo col.type.dateTime da API do Power BI nem sempre é preenchido corretamente dependendo da fonte de dados.
Ordenação por frequência
Em vez de ordenação alfabética, exibir primeiro os valores que aparecem com mais frequência nas linhas indexadas. Isso requer mudança na lógica de renderSuggestions() e avaliação do impacto de performance em datasets grandes. Será configurável via Format Pane como alternativa à ordenação alfabética.
Conclusão
O Global Search não substitui um modelo de dados bem projetado. Ele resolve um problema específico que o Power BI não cobre nativamente: oferecer ao usuário final um ponto de entrada único para localizar qualquer valor em qualquer campo do modelo, sem exigir conhecimento da estrutura do relatório.
É gratuito, sem coleta de dados e sem dependências externas. O código é completamente isolado no ambiente do visual, sem chamadas de rede, sem SDKs de terceiros e sem telemetria.
Disponível no AppSource para uso imediato em qualquer relatório Power BI.
Caso seja para você útil, por gentileza, avalie positivamente 😁
