Pular para o conteúdo

Pesquisa de texto

O Firestore não suporta pesquisa de texto nativa, então precisamos recorrer a soluções externas. Se você especificar uma flag textSearchEnabled na coleção, verá uma barra de pesquisa no topo da visualização da coleção.

OpçãoCustoConfiguraçãoMelhor para
Extensão Typesense (Recomendado)~$7-14/mês fixo5 minA maioria dos projetos
AlgoliaPreços por consulta15 minEnterprise, geo-search
Pesquisa de texto localGratuita1 minColeções pequenas (<1000 doc)

A extensão FireCMS Typesense implanta um servidor de pesquisa Typesense em uma VM do Compute Engine e sincroniza automaticamente seus dados do Firestore.

  • 🔍 Pesquisa tolerante a erros de digitação - “headphnes” encontra “headphones”
  • Respostas em sub-milissegundos
  • 💰 Custo mensal fixo - Sem cobranças por consulta
  • 🔄 Sincronização em tempo real - Os documentos são indexados automaticamente

Pré-requisitos:

  • Projeto Firebase com Firestore
  • Faturamento GCP habilitado
  • gcloud CLI instalado

Passo 1: Instale a extensão

firebase ext:install https://github.com/firecmsco/typesense-extension --project=YOUR_PROJECT_ID

Passo 2: Conceda as permissões

export PROJECT_ID=your-project-id
export EXT_INSTANCE_ID=typesense-search # Nome padrão da extensão
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:ext-${EXT_INSTANCE_ID}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/compute.admin" --condition=None
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:ext-${EXT_INSTANCE_ID}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/secretmanager.admin" --condition=None
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:ext-${EXT_INSTANCE_ID}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/datastore.user" --condition=None

Passo 3: Provisione o servidor de pesquisa

curl "https://REGION-PROJECT_ID.cloudfunctions.net/ext-typesense-search-provisionSearchNode"

Aguarde ~2 minutos. Os documentos existentes são indexados automaticamente.

Navegue até Configurações do projeto e configure:

ConfiguraçãoValor
RegiãoA região da sua extensão (ex., us-central1)
ID da instância da extensãoPadrão: typesense-search

O FireCMS Cloud se conecta automaticamente à sua instância Typesense.

import { buildFireCMSSearchController, useFirestoreDelegate } from "@firecms/firebase";
const textSearchControllerBuilder = buildFireCMSSearchController({
region: "us-central1", // A região da sua extensão
extensionInstanceId: "typesense-search" // Nome padrão
});
export function App() {
const firestoreDelegate = useFirestoreDelegate({
firebaseApp,
textSearchControllerBuilder
});
// ... restante da sua aplicação
}

Algolia é um serviço de pesquisa gerenciado com preços por consulta. Recomendado para necessidades enterprise ou funcionalidades avançadas como geo-search.

Você precisa definir um FirestoreTextSearchControllerBuilder e adicioná-lo à sua configuração. Configure uma conta Algolia e sincronize os documentos usando a extensão Firebase deles.

import { algoliasearch, SearchClient } from "algoliasearch";
import {
performAlgoliaTextSearch,
buildExternalSearchController,
FirestoreTextSearchController,
buildCollection,
FireCMSCloudApp,
EntityCollectionsBuilder,
FireCMSAppConfig
} from "@firecms/cloud";
const client: SearchClient | undefined = algoliasearch("YOUR_ALGOLIA_APP_ID", "YOUR_ALGOLIA_SEARCH_KEY");
const algoliaSearchController = buildExternalSearchController({
isPathSupported: (path) => path === "products",
search: async ({
path,
searchString
}) => {
if (path === "products") {
return performAlgoliaTextSearch(client, "products", searchString);
}
return undefined;
}
});
const appConfig: FireCMSAppConfig = {
version: "1",
textSearchControllerBuilder: algoliaSearchController,
// ...
}
import { algoliasearch, SearchClient } from "algoliasearch";
import { buildExternalSearchController, performAlgoliaTextSearch } from "@firecms/firebase";
const client: SearchClient | undefined = algoliasearch("YOUR_ALGOLIA_APP_ID", "YOUR_ALGOLIA_SEARCH_KEY");
const algoliaSearchController = buildExternalSearchController({
isPathSupported: (path) => path === "products",
search: async ({
path,
searchString
}) => {
if (path === "products")
return performAlgoliaTextSearch(client, "products", searchString);
return undefined;
}
});
export function App() {
// ...
const firestoreDelegate = useFirestoreDelegate({
firebaseApp,
textSearchControllerBuilder: algoliaSearchControllerBuilder
});
// ...
}

A partir do FireCMS v3, fornecemos uma implementação de pesquisa de texto local. Isso é útil para coleções pequenas ou quando você deseja fornecer uma maneira rápida de pesquisar nos seus dados.

No entanto, para coleções maiores, você vai querer usar um provedor de pesquisa externa, como Algolia. Esta é a abordagem recomendada.

Você pode usar a pesquisa de texto local no FireCMS Cloud ou nas versões self-hosted.

Para o FireCMS Cloud, basta habilitá-la na interface.

Para versões self-hosted, você pode habilitá-la definindo localTextSearchEnabled em useFirestoreDelegate. Depois, precisa marcar cada coleção com textSearchEnabled: true.

Se você declarou um provedor de indexação externo, a pesquisa de texto local será efetiva apenas para os caminhos não suportados pelo provedor externo.