PHPackages                             moritz-sauer-13/silverstripe-typesense-instantsearch - 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. [API Development](/categories/api)
4. /
5. moritz-sauer-13/silverstripe-typesense-instantsearch

ActiveSilverstripe-vendormodule[API Development](/categories/api)

moritz-sauer-13/silverstripe-typesense-instantsearch
====================================================

Reusable Typesense scoped-key ACL, InstantSearch core, and integrated Silverstripe Typesense backend for Silverstripe projects

2.0.0(3mo ago)016↓88.9%LGPL-3.0-or-laterPHP

Since Mar 25Pushed 2mo agoCompare

[ Source](https://github.com/moritz-sauer-13/silverstripe-typesense-instantsearch)[ Packagist](https://packagist.org/packages/moritz-sauer-13/silverstripe-typesense-instantsearch)[ RSS](/packages/moritz-sauer-13-silverstripe-typesense-instantsearch/feed)WikiDiscussions main Synced 3w ago

READMEChangelog (5)Dependencies (12)Versions (6)Used By (0)

Silverstripe Typesense Search Module
====================================

[](#silverstripe-typesense-search-module)

> Hinweis: Dieses Modul ist eine Erweiterung auf Basis von Elliots Modul `elliotsawyer/silverstripe-typesense`. Die Kernfunktionalitaet wurde vollstaendig in dieses Modul integriert.

Dieses Modul kapselt die wiederverwendbaren Bausteine fuer eine sichere Typesense-Suche mit Scoped Keys, ACL-Filtern und zentralem InstantSearch-Core.

Was das Modul liefert
---------------------

[](#was-das-modul-liefert)

- Scoped Search Keys pro Request/User inkl. Cache und TTL
- Serverseitige ACL-Filter (`SearchVisible` + `AccessibleTo`)
- Endpoint fuer Key-Refresh (`/typesense/key`) fuer JS-Retry bei abgelaufenem Key
- Trait/Extensions fuer konsistenten Dokumentbau und Link-Sanitizing
- BaseElement-Integration mit Visibility-Vererbung von der Parent-Seite
- Setup-Task fuer ACL-Felder in allen Typesense-Collections
- integriertes Typesense-Backend auf Basis von Elliot Sawyer (inkl. Live/Stage-Sync-Logik im `DocumentUpdate`)
- zentraler JS-Core: `client/javascript/instantsearch-core.js`

Hinweis: Projektspezifische Widgets/Skripte (z. B. Blog-, Event-, Defect-Suche) bleiben absichtlich im Projekt.

Abhaengigkeiten
---------------

[](#abhaengigkeiten)

Dieses Modul zieht die zentralen Pakete selbst:

- `typesense/typesense-php`
- `php-http/curl-client`
- `symbiote/silverstripe-queuedjobs`
- `symbiote/silverstripe-multivaluefield`
- `symbiote/silverstripe-gridfieldextensions`

Installation (Projekt)
----------------------

[](#installation-projekt)

1. Modul als Composer-Dependency einbinden.
2. Composer laufen lassen.

Beispiel fuer lokales Path-Repository:

```
{
  "repositories": [
    {
      "type": "path",
      "url": "silverstripe-typesense-instantsearch",
      "options": { "symlink": true }
    }
  ],
  "require": {
    "moritz-sauer-13/silverstripe-typesense-instantsearch": "*"
  }
}
```

Dann:

```
composer update moritz-sauer-13/silverstripe-typesense-instantsearch --with-all-dependencies
```

Umgebungsvariablen
------------------

[](#umgebungsvariablen)

Pflicht:

- `TYPESENSE_SERVER`
- `TYPESENSE_SEARCH_KEY` (Parent Search Key, nur `documents:search`)

Optional:

- `TYPESENSE_COLLECTION_PREFIX`
- `TYPESENSE_SCOPED_KEY_TTL` (Default: `3600`)
- `TYPESENSE_SCOPED_KEY_CACHE_TTL` (Default: `3300`)

Empfehlung:

- Key-TTL immer groesser als Cache-TTL setzen.
- Parent-Key niemals clientseitig ausgeben.

Automatische Modul-Konfiguration
--------------------------------

[](#automatische-modul-konfiguration)

Das Modul registriert automatisch:

- `ElliotSawyer\SilverstripeTypesense\DocumentUpdate` auf `SilverStripe\ORM\DataObject`
- `MoritzSauer\Instantsearch\Extensions\BaseElementSearchVisibilityExtension` auf `DNADesign\Elemental\Models\BaseElement`
- `MoritzSauer\Instantsearch\Extensions\TypesenseCollectionExtension` auf `ElliotSawyer\SilverstripeTypesense\Collection`
- Route `_typesense` auf `ElliotSawyer\SilverstripeTypesense\Typesense`
- Route `typesense/key` auf `MoritzSauer\Instantsearch\Controller\TypesenseKeyController`
- Cache `Psr\SimpleCache\CacheInterface.TypesenseCache`
- Cache `Psr\SimpleCache\CacheInterface.TypesenseScopedKeyCache`

Optional vorhanden, aber nicht automatisch aktiviert:

- `MoritzSauer\Instantsearch\Extensions\FrontendVisibilityExtension` fuer DataObjects mit eigener Sichtbarkeitssteuerung

Indexing-Vertrag (wichtig)
--------------------------

[](#indexing-vertrag-wichtig)

Damit die ACL sauber funktioniert, muessen alle indizierten Dokumente diese Felder haben:

- `SearchVisible` (`bool`)
- `AccessibleTo` (`string[]`)

Zusatz:

- `Link` muss ohne `stage=Stage`/`stage=Live` gespeichert werden.

Das erledigen bereits:

- `MoritzSauer\Instantsearch\Objects\TypesenseDocumentBuilderTrait` fuer Pages/DataObjects
- `MoritzSauer\Instantsearch\Extensions\BaseElementSearchVisibilityExtension` fuer Elemental-Elemente

Tasks nach Setup oder Schema-Aenderung
--------------------------------------

[](#tasks-nach-setup-oder-schema-aenderung)

1. ACL-Felder im Schema sicherstellen:

```
php vendor/bin/sake dev/tasks/TypesenseAclSetupTask
```

2. Danach reindizieren:

```
php vendor/bin/sake dev/tasks/TypesenseSyncTask
```

Wenn Fields in Collections geaendert wurden, immer beide Tasks ausfuehren.

InstantSearch auf neuer Seite integrieren
-----------------------------------------

[](#instantsearch-auf-neuer-seite-integrieren)

### 1) Konfiguration im HTML bereitstellen

[](#1-konfiguration-im-html-bereitstellen)

Der JS-Core liest Konfiguration entweder vom Suchcontainer oder als Fallback von `html[data-typesense-*]`.

Minimal:

- `data-typesense-search-key`
- `data-typesense-server`
- `data-typesense-key-refresh-url`

Empfehlung: zentral auf `` setzen, nur collection-spezifische Werte am Container.

### 2) JS-Abhaengigkeiten laden

[](#2-js-abhaengigkeiten-laden)

Reihenfolge:

1. `typesense-instantsearch-adapter`
2. `instantsearch.js`
3. Modul-Core:
    - `moritz-sauer-13/silverstripe-typesense-instantsearch:client/javascript/instantsearch-core.js`
4. seiten-spezifisches Suchskript

### 3) Search Client aufbauen

[](#3-search-client-aufbauen)

Fuer einzelne Collection:

- `AppInstantSearch.createSearchClient(...)`

Fuer Suche ueber mehrere Collections:

- `AppInstantSearch.createUnionSearchClient(...)`

### 4) Treffer korrekt rendern

[](#4-treffer-korrekt-rendern)

- Titel/Highlights: `AppInstantSearch.renderHighlight(...)`
- Teaser/Text: `AppInstantSearch.stripHtml(...)`
- Links: `AppInstantSearch.normalizeSearchLink(...)`

JS-Fallback bei abgelaufenem Key
--------------------------------

[](#js-fallback-bei-abgelaufenem-key)

Der Core faengt Auth-Fehler (`401/403`, invalid key) ab, holt ueber `/typesense/key` einen neuen Scoped Key und wiederholt den Request einmal automatisch.

Voraussetzung:

- `data-typesense-key-refresh-url` muss gesetzt sein.

Sicherheit und Betriebsregeln
-----------------------------

[](#sicherheit-und-betriebsregeln)

- Parent Search Key nie an Browser ausgeben.
- Zugriff immer ueber Scoped Key.
- Request-Filter aus dem Widget sind nur zusaetzliche Einschraenkung. Der ACL-Filter aus dem Scoped Key bleibt immer aktiv.
- Nach Visibility-Aenderungen reindizieren.
- Fuer versionierte Inhalte auf Live-Workflow achten (die Live/Stage-Sync-Logik ist direkt im integrierten `DocumentUpdate` enthalten).

Troubleshooting
---------------

[](#troubleshooting)

### Fehler: `Could not find a filter field named 'SearchVisible'`

[](#fehler-could-not-find-a-filter-field-named-searchvisible)

Ursache:

- Feld fehlt im Typesense-Schema.

Loesung:

1. `php vendor/bin/sake dev/tasks/TypesenseAclSetupTask`
2. `php vendor/bin/sake dev/tasks/TypesenseSyncTask`

### Trefferlink enthaelt `stage=Stage` oder `stage=Live`

[](#trefferlink-enthaelt-stagestage-oder-stagelive)

Pruefen:

- Wird `normalizeSearchLink()` im Frontend verwendet?
- Wird Dokumentbau ueber Trait/Extension gemacht (sanitized `Link`)?
- Wurde nach Codeaenderung reindiziert?

### Highlight zeigt `` als Text

[](#highlight-zeigt-mark-als-text)

Pruefen:

- Rendering ueber `AppInstantSearch.renderHighlight(...)`
- Nicht ungefiltert escapen, nachdem `renderHighlight` bereits verarbeitet wurde

Was im Projekt bleiben sollte
-----------------------------

[](#was-im-projekt-bleiben-sollte)

- Suche-UI und Templates pro Seite/Feature
- projektspezifische `query_by`, Sortierung, Widgets
- projektspezifische Business-Filter (z. B. nur DefectReport in Defect-Suche)

Das Modul bleibt damit der wiederverwendbare Kern, das Projekt steuert die Darstellung und fachliche Suche je Seite.

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance84

Actively maintained with recent releases

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity38

Early-stage or recently created project

 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 ~6 days

Total

4

Last Release

74d ago

Major Versions

0.1.1 → 2.0.02026-03-25

### Community

Maintainers

![](https://www.gravatar.com/avatar/237ff98c98e71b509c4dac62b31efaf7823cca011952ded67579a6cf763b7a47?d=identicon)[moritz-sauer-13](/maintainers/moritz-sauer-13)

---

Top Contributors

[![moritz-sauer-13](https://avatars.githubusercontent.com/u/43135946?v=4)](https://github.com/moritz-sauer-13 "moritz-sauer-13 (6 commits)")

### Embed Badge

![Health badge](/badges/moritz-sauer-13-silverstripe-typesense-instantsearch/health.svg)

```
[![Health](https://phpackages.com/badges/moritz-sauer-13-silverstripe-typesense-instantsearch/health.svg)](https://phpackages.com/packages/moritz-sauer-13-silverstripe-typesense-instantsearch)
```

###  Alternatives

[acseo/typesense-bundle

This bundle provides integration with Typesense in Symfony

73119.1k1](/packages/acseo-typesense-bundle)[silverstripe/graphql

GraphQL server for SilverStripe models and other data

512.5M22](/packages/silverstripe-graphql)[php-heroku-client/php-heroku-client

A PHP client for the Heroku Platform API

24413.4k4](/packages/php-heroku-client-php-heroku-client)[shipstream/ups-rest-php-sdk

PHP SDK for UPS REST API

2258.7k](/packages/shipstream-ups-rest-php-sdk)[craftpulse/craft-typesense

Craft Plugin that synchronises with Typesense

122.7k](/packages/craftpulse-craft-typesense)

PHPackages © 2026

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