NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #2820 most downloaded on Packagist
A fully featured full text search engine written in PHP
Last release 1 months ago
11 Aug 2026
Ships fairly regularly
a new release about every 4 months
Rarely documented
notes for 4 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
72 releases · first in 2016
Faster indexing and a couple of correctness fixes.
Faster indexing and a couple of correctness fixes.
saveWordlist() no longer inserts each term and catches a UNIQUE-constraint exception (re-preparing every statement per duplicate term); it uses a single INSERT … ON CONFLICT(term) DO UPDATE upsert and resolves term ids without SELECT MAX(id).insert() is ~25× faster for large documents. Each document is now indexed inside a single transaction instead of one implicit commit (fsync) per wordlist/doclist write — so indexing e.g. a PDF per insert() call no longer pays thousands of fsyncs. (#360)total_documents was left at 0 when the number of indexed rows was an exact multiple of the 10,000-row commit batch, because the final transaction was left open and the info-table update rolled back. This corrupted BM25 idf = log(count / df) for such indexes.MysqlEngine wordlist upsert accumulated num_hits using the document count instead of the hit count, giving multi-document terms the wrong total occurrence count.benchmark/ harness (seeded Zipfian dataset generator + timers) for measuring index-creation speed.Full Changelog: v5.2.0...v5.3.0
One column per quarter.
SqliteEngine::createIndex() now creates the storage directory if it doesn't exist
SqliteEngine::createIndex() now creates the storage directory if it doesn't exist (#304)SqliteEngine & MysqlEngine (#302)-term negation now excludes results (AND-NOT) instead of unioning the NOT set, and no longer crashes on two negations (#263, #246, #267)searchBoolean() now returns a docScores key, matching search() (fixes "Undefined index: docScores" in Laravel Scout) (#278)filesystemMapIdsToPaths() returns null for an id with no filemap row instead of silently coercing to $res[0] (#130)acos() domain in TNTGeoSearch to avoid NAN distances silently dropping the closest result (#357)RedisEngine::createIndex() no longer throws "must not be accessed before initialization" on the typed $dbh propertyselectIndex()/createIndex() writing terms to the previously selected index when switching indexes in one process (Laravel Scout with multiple models)Full Changelog: v5.1.0...v5.2.0
Fix selectIndex()/createIndex() writing terms to the wrong index ( #367 ). Switching indexes in a single process (e.g. Laravel Scout with multiple sea
Fix selectIndex()/createIndex() writing terms to the wrong index (#367).
Switching indexes in a single process (e.g. Laravel Scout with multiple
searchable models) no longer corrupts the previously selected index.
Nothing published for this version
Nothing published for this version
Skip 'non-string' and empty values by @leonardfischer in #342
Full Changelog: v5.0.0...v5.0.1
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →