becklyn/search-text-transformer
Converts HTML into clean, searchable plain text for indexing with search engines like Elasticsearch. Use SearchTextTransformer to strip tags and normalize content, making page text suitable for full‑text search and highlighting.
saved events on models) or queue-based async processing (e.g., search-text-transform:worker). Supports both real-time (e.g., API responses) and batch (e.g., nightly re-indexing) use cases.SearchTextTransformer to an interface (e.g., HtmlToTextTransformer) for mocking in tests.SearchText facade for concise usage (e.g., SearchText::transform($html)).search:text-transform for CLI batch processing.toSearchableArray() to include transformed text.LONGTEXT fields) to modern search backends with minimal refactoring.| Risk | Mitigation |
|---|---|
| HTML Parsing Limitations | Supplement with DOMDocument for edge cases (e.g., nested tables, malformed markup). |
| Performance Bottlenecks | Benchmark with large payloads (e.g., 1MB HTML); cache transformed results if reprocessing is common. |
| Maintenance Risk (Last Release: 2022) | Fork the repo under your org’s GitHub; monitor for PHP 8.x compatibility issues. |
| Search Relevance Degradation | A/B test transformed vs. raw HTML in search results; adjust rules if needed. |
| Dependency Conflicts | Verify compatibility with Laravel’s PHP version (tested on 8.x); no heavy dependencies. |
searchable_text column) or used transiently?<h1>–<h3>)?AppServiceProvider:
$this->app->bind(HtmlToTextTransformer::class, function ($app) {
return new SearchTextTransformer();
});
app/Facades/SearchText.php for cleaner usage:
SearchText::transform($html);
app/Console/Commands/TransformSearchText.php for batch processing:
php artisan search:text-transform --model=Post --batch=100
$transformedText = app(HtmlToTextTransformer::class)->transform($post->body);
$elasticsearch->index('posts', $post->id, ['text' => $transformedText]);
toSearchableArray():
public function toSearchableArray()
{
return [
'body' => SearchText::transform($this->body),
// other fields...
];
}
$client->saveObject([
'objectID' => $post->id,
'text' => SearchText::transform($post->body),
]);
search-text-transform:worker) for async processing:
// In a model observer or event listener
TransformSearchTextJob::dispatch($post);
* 3 * * * php artisan search:text-transform --model=Post --batch=500
saved) or API routes:
// In PostObserver.php
public function saved(Post $post)
{
TransformSearchTextJob::dispatch($post);
}
$cacheKey = "search_text:{$post->id}";
$transformedText = cache()->remember($cacheKey, now()->addHours(1), function () use ($post) {
return SearchText::transform($post->body);
});
DOMDocument for complex cases (e.g., nested tables).keyword vs. text fields).Raw HTML → [SearchTextTransformer] → Clean Text → [Elasticsearch/Algolia Indexer]
Model Save → [Event Listener] → [SearchTextTransformer] → Update Search Index
How can I help you explore Laravel packages today?