Cliente Elasticsearch para Swift (iOS/macOS)
\n\nElasticsearch é um poderoso sistema de busca e análise distribuído, construído sobre o Apache Lucene. Para integração com aplicativos móveis e desktop em Swift (iOS/macOS), existe um cliente especializado Elasticsearch Swift. Esta biblioteca fornece uma API conveniente para executar consultas de pesquisa, indexação de dados, agregações e gerenciamento de cluster diretamente de aplicativos Apple.
\n\nPrincipais recursos da biblioteca
\n\n- \n
- Pesquisa de texto completo — suporte a todos os tipos de consultas do Elasticsearch (match, term, bool, fuzzy, etc.) \n
- Operações CRUD — criação, leitura, atualização e exclusão de documentos em índices \n
- Agregações — construção de relatórios analíticos complexos (terms, range, date_histogram, etc.) \n
- Processamento em lote — operações bulk para carregamento massivo de dados \n
- Suporte a assincronia — funcionamento com async/await e Combine \n
- SSL/TLS e autenticação — conexão segura ao cluster \n
Instalação
\n\nAdicione a biblioteca via Swift Package Manager. No Xcode, selecione File → Add Packages e insira a URL do repositório:
https://github.com/elastic/elasticsearch-swift.git\n\nOu adicione a dependência no Package.swift:
dependencies: [\n .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "1.0.0")\n]\n\nInicialização do cliente
\n\nCrie uma instância de ElasticsearchClient especificando o host e a porta do Elasticsearch:
import Elasticsearch\n\nlet client = ElasticsearchClient(\n host: "http://localhost:9200",\n username: "elastic",\n password: "changeme"\n)\n\nPara conectar ao Elastic Cloud, use o construtor com URL e chave de API:
\n\nlet client = ElasticsearchClient(\n cloudID: "my-cluster:dXM...",\n apiKey: "base64EncodedApiKey"\n)\n\nIndexação de documentos
\n\nVamos criar um modelo simples de usuário e indexá-lo:
\n\nstruct User: Codable {\n let name: String\n let email: String\n let age: Int\n}\n\nlet user = User(name: "Alexey", email: "alex@example.com", age: 30)\n\nTask {\n let response = try await client.index(\n index: "users",\n id: "1",\n body: user\n )\n print("Documento criado: \\(response.result)")\n}\n\nPesquisa de documentos
\n\nPesquisar usuários pelo nome usando uma consulta match:
\n\nlet searchQuery: [String: Any] = [\n "query": [\n "match": [\n "name": "Alexey"\n ]\n ]\n]\n\nTask {\n let response = try await client.search(\n index: "users",\n body: searchQuery\n )\n \n if let hits = response.hits?.hits {\n for hit in hits {\n if let source = hit.source as? [String: Any] {\n print("Encontrado: \\(source["name"] ?? "")")\n }\n }\n }\n}\n\nAgregações
\n\nVamos construir um histograma por idade dos usuários:
\n\nlet aggregationQuery: [String: Any] = [\n "size": 0,\n "aggs": [\n "age_ranges": [\n "range": [\n "field": "age",\n "ranges": [\n ["to": 20],\n ["from": 20, "to": 40],\n ["from": 40]\n ]\n ]\n ]\n ]\n]\n\nTask {\n let response = try await client.search(\n index: "users",\n body: aggregationQuery\n )\n \n if let buckets = response.aggregations?["age_ranges"] as? [String: Any] {\n print("Resultados da agregação: \\(buckets)")\n }\n}\n\nAtualização e exclusão
\n\nAtualização da idade do