PHPackages                             autopage/pg-search - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. autopage/pg-search

ActiveCakephp-plugin[Search &amp; Filtering](/categories/search)

autopage/pg-search
==================

Busca Textual com PostgreSQL no CakePHP

1.2.5(4y ago)1572[1 issues](https://github.com/ionews/cakephp-pg-search/issues)MITPHPPHP &gt;=7.2

Since Apr 14Pushed 4y ago1 watchersCompare

[ Source](https://github.com/ionews/cakephp-pg-search)[ Packagist](https://packagist.org/packages/autopage/pg-search)[ RSS](/packages/autopage-pg-search/feed)WikiDiscussions main Synced 3w ago

READMEChangelog (4)Dependencies (4)Versions (5)Used By (0)

Busca Textual com PostgreSQL no CakePHP
=======================================

[](#busca-textual-com-postgresql-no-cakephp)

[![License](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](LICENSE)[![CI](https://github.com/ionews/cakephp-pg-search/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/ionews/cakephp-pg-search/actions/workflows/ci.yml)[![Coverage](https://camo.githubusercontent.com/3a370cb404ee46a6b059279f6d0b34884bb1eae44ae99444b5b6f2d406a45250/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f696f6e6577732f63616b657068702d70672d7365617263683f7374796c653d666c61742d737175617265)](https://codecov.io/gh/ionews/cakephp-pg-search/branch/main)[![Downloads](https://camo.githubusercontent.com/309761b557e0b28295fe9b5303b84526221d472585403e3147825cec43a4e244/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6175746f706167652f70672d7365617263682e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/autopage/pg-search)[![Latest Stable](https://camo.githubusercontent.com/16346c61c8438f7e3261e2ecd29d24381f5b424a79385cbf686fc7e839a60360/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6175746f706167652f70672d7365617263682e7376673f7374796c653d666c61742d737175617265266c6162656c3d737461626c65)](https://packagist.org/packages/autopage/pg-search)

Adicione suporte a [Full Text Search do Postgres](https://www.postgresql.org/docs/current/textsearch.html) em sua aplicação CakePHP.

Requisitos
----------

[](#requisitos)

- PHP 7.2+
- CakePHP 4.2.2+
- PostgreSQL 9.6+

Instalar
--------

[](#instalar)

Inclua o plugin como dependência

```
composer require autopage/pg-search

```

Uso
---

[](#uso)

Para ter todos os recursos disponíveis, você deve configurar sua aplicação para usar o `Driver` fornecido aqui na conexão com o banco de dados. Ele habilitará o uso do `TableSchema` e `PostgresSchemaDialect` incluidos no plugin que estendem as versões padrão do CakePHP para implementar o tipo de coluna `tsvector` e aos índices do tipo `gin` e `gist`.

### Configuração

[](#configuração)

No seu `app_local.php`:

```
    // ...
    'Datasources' => [
        'default' => [
            'className' => \Cake\Database\Connection::class,
            'driver' => \Autopage\PgSearch\Database\Driver\Postgres::class,
            // O restante da sua configuração vem normalmente
            // ...
        ],
    // ...
```

Outra configuração importante, mas opcional, é definir qual [*configuração de busca*](https://www.postgresql.org/docs/current/textsearch-configuration.html) o PostgreSQL deve usar na hora de indexar ou buscar um campo do tipo `tsvector`.

Você pode configurar ela com a chave `PgSearch.config_name`. Supondo que você criou no seu banco de dados uma configuração de nome **portuguese**, o seu `app_local.php` ficaria:

```
    // ...
    'PgSearch' => [
        'config_name' => 'portuguese',
    ],
    // ...
```

### SearchableBehavior

[](#searchablebehavior)

Associe as tabelas que deseja tornar pesquisável ao behavior, desta forma, sempre que um registro for criado/editado/excluído, as informações serão propagadas para a tabela de busca.

```
    /**
     * Método de inicialização da Table
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config): void
    {
        parent::initialize($config);

        $this->addBehavior('Searchable', [
            'foreign_key' => 'origem_id',
            'mapper' => function ($entidade) {
                return [
                    'origem_id' => $entidade->id,
                    'conteudo' => $entidade->descricao,
                ];
            },
        ]);
    }
```

#### Configurações disponíveis

[](#configurações-disponíveis)

- **target**: `string`. Nome do repositório (`Table`) que deve ser usada para persistir os registros de forma pesquisável. Por padrão usa uma `Table` com nome igual a que está vinculada ao `Behavior`, adicionado o sufixo *'Searches'*. Exemplo: `Posts` -&gt; `PostsSearches`.
- **foreign\_key**: `string`. Nome da coluna em **target** que referencia o registro original. Por padrão usa o nome da tabela no singular adicionado o sufixo *'\_id'*. Exemplo: `Posts` -&gt; `post_id`
- **mapper**: `callable`. Método/função que converte uma entidade do repositório original para uma de *target*. Por padrão, ele copia todos os campos da entidade original na entidade nova e associa a chave estrangeira da nova a chave primária da original.
- **doIndex**: `bool|callable`. Se deve ou não indexar o registro. Permite um controle individual. Por padrão o valor é `true`.
- **doDeindex**: `bool|callable`. Se deve ou não desindexar o registro. Permite um controle individual e suporte a remoção lógica (*soft-delete*). Por padrão o valor é `false`.

#### Finder FTS

[](#finder-fts)

O *behavior* disponibiliza o *finder* de nome `fts`. Como todo *finder*, ele recebe uma *query* e também retorna uma *query*. Dessa forma, você pode usar ele para preparar uma *query* antes ou depois de chamar ele, estendendo as condições e qualquer outra operação possível em uma *query*.

Os parâmetros especiais desse *finder* são:

- **field**: `string` (*obrigatório*). Nome do campo do tipo tsvector onde a busca será feita
- **value**: `string` (*obrigatório*). Valor que deve ser comparado com o campo
- **highlight**: `boolean`. Flag indicando se deve ou não incluir destaque nos termos encontrados. Por padrão é desativado.
- **highlight\_field**: `string` (*obrigatório* apenas se **highlight** for `true`). Nome do campo textual onde o highlight será aplicado
- **exact**: `boolean`. Se a comparação será do tipo exata ou aproximada. Por padrão é aproximada (`false`).
- **ts\_function**: `string`. Caso seja necessário utilizar uma função diferente da aproximada ou exata para parseamento.
- **configuration**: `string`. Nome da configuração de busca usada na comparação. Por padrão, usa a mesma definida em `PgSearch.config_name`.
- **ranked**: `boolean`. Flag indicando se a *query* deve ser ordenada por *score*.

FAQ
---

[](#faq)

### Preciso mesmo usar o driver do plugin na minha aplicação?

[](#preciso-mesmo-usar-o-driver-do-plugin-na-minha-aplicação)

Não, não precisa. Mas ao não usar, você terá de dizer em cada `Table` que possui coluna `tsvector` qual é essa coluna.

Nos seus testes unitários, também não será possível criar `Fixture` com esse tipo de coluna ou um dos índices `gin` e `gist`.

Em resumo: não precisa, mas deveria.

### Por que usar uma tabela separada para indexar?

[](#por-que-usar-uma-tabela-separada-para-indexar)

É uma decisão pessoal, tirada após trabalhar com sistemas que migram de backend de busca/indexação ao longo do tempo. Separar as tabelas te fornece mais flexibilidade. E o *tradeoff* é o uso um pouco maior de disco.

Essa tabela indexada pode ser uma versão desnormalizada de outra, permitindo que você faça várias consultas que exigiriam `joins` e `subqueries` de outra maneira. Em um segundo momento, quando passar a ter bilhões de registros, você pode querer desacoplar essa tabela do banco principal e passar para uma outra instância, ou mesmo para um serviço especializado como Elasticsearch, Solr e Sphinx.

### Entendi, mas posso usar a mesma tabela do registro principal?

[](#entendi-mas-posso-usar-a-mesma-tabela-do-registro-principal)

Até pode, mas você ganharia apenas o `finder` como vantagem - os recursos de sincronização ficam desativados.

###  Health Score

21

—

LowBetter than 18% of packages

Maintenance0

Infrequent updates — may be unmaintained

Popularity16

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~99 days

Total

4

Last Release

1606d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6b5400117f71ee0df6868fd300a96fceb0405ee8e959ea2df3116387d41c5a83?d=identicon)[CauanCabral](/maintainers/CauanCabral)

---

Top Contributors

[![CauanCabral](https://avatars.githubusercontent.com/u/83092?v=4)](https://github.com/CauanCabral "CauanCabral (8 commits)")

---

Tags

cakephpfulltext-searchpostgresql

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/autopage-pg-search/health.svg)

```
[![Health](https://phpackages.com/badges/autopage-pg-search/health.svg)](https://phpackages.com/packages/autopage-pg-search)
```

###  Alternatives

[cakephp/debug_kit

CakePHP Debug Kit

86314.7M170](/packages/cakephp-debug-kit)[cakephp/bake

Bake plugin for CakePHP

11212.0M201](/packages/cakephp-bake)[dereuromark/cakephp-queue

The Queue plugin for CakePHP provides deferred task execution.

308954.9k25](/packages/dereuromark-cakephp-queue)[dereuromark/cakephp-ide-helper

CakePHP IdeHelper Plugin to improve auto-completion

1882.3M43](/packages/dereuromark-cakephp-ide-helper)[friendsofcake/search

CakePHP Search plugin using PRG pattern

1722.2M49](/packages/friendsofcake-search)[dereuromark/cakephp-tools

A CakePHP plugin containing lots of useful and reusable tools

3361.0M51](/packages/dereuromark-cakephp-tools)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
