Releases: loupe-php/loupe
Release list
1.0.1
Loupe 1.0 🎉🎉🎉
Today, I am very excited to announce Loupe 1.0! 🎉
This is more than a version number. It is an acknowledgement of what Loupe has become.
Loupe started more than three years ago with a deliberately simple idea: what if a PHP application could have a
genuinely good search experience without operating another service? No containers, no daemon, no external
infrastructure - just PHP, SQLite and the filesystem that is already there.
Since then, Loupe has grown far beyond that first experiment. It is used in many production systems, has processed
real data and real queries for years and has proven to be a dependable and extremely valuable tool. Calling it
0.x no longer reflects that reality.
Loupe 1.0 does.
What makes Loupe 1.0
The most important feature of 1.0 is confidence. Loupe is not being declared stable because the code suddenly became
finished. After all, software never is. It is stable because the project and its API have been shaped by years of practical use,
bug fixes, performance work and feedback from production.
Loupe now provides a remarkably complete search engine while keeping its original promise: It is small enough to install with Composer and powerful enough to replace the search service in a wide range of real applications.
Compound words are searchable by their parts
One of the headline additions in 1.0. is automatic term decomposition for English and German!
Loupe can now understand that toothbrush contains tooth and brush or that Wartungsvertrag contains
Wartung and Vertrag. Searching for one of those individual terms finds the complete compound word, while the
original word remains searchable as before.
This matters enormously for search quality. Users should not need to know whether a word was stored separately,
hyphenated or as part of a compound. Loupe handles that work during indexing using language-specific dictionaries
and decomposition rules.
For German content in particular, where compound words are everywhere, this closes a significant gap between a basic
token-based search and the experience people expect from a proper search engine.
Better excerpts from long content
Loupe 1.0 also makes cropped search-result excerpts much more useful. Matches can be prioritized so that the returned
fragments show the strongest context instead of simply taking the first occurrence. The maximum number of fragments
is configurable, giving applications better control over the balance between context and result size.
Together with highlighting, this makes it much easier to show users not only that a document matched but why it
matched.
Accuracy and performance continue to improve
The work toward 1.0 includes more accurate query-language detection and more consistent term positions across
multi-attribute documents. It also avoids unnecessary state-set writes, caches unavailable stemmers, and expands the
benchmark suite to cover attribute-specific queries and database size.
These changes are less visible than a new search option but they represent the kind of work that turns useful
software into dependable infrastructure: fewer unnecessary operations, better measurements and more predictable
results.
Upgrading
Install or upgrade Loupe with Composer:
composer require loupe/loupe:^1.0Thank you
Thank you to everyone who has used Loupe, reported an issue, contributed code, shared performance results, improved the
documentation or simply trusted it with a production workload. A very special thank you goes to @daun, whose dozens of contributions - from negated queries, stop words and configurable ranking to highlighting, cropping, matching strategies, benchmarking and major performance improvements - have shaped nearly every part of Loupe. Version 1.0 simply would not be what it is today without him.
Let's celebrate, Loupe has earned its 1.0! 🥳
0.13.23
0.13.22
0.13.20
0.13.19
0.13.18
Massive Performance Improvements 🚀
I'm super excited to release Loupe 0.13.18, bringing some of the largest performance gains we've seen so far.
General improvements
This release delivers dramatic improvements across a wide range of query types:
- Multi-word queries: up to 8× faster
- Phrase queries: up to 32× faster
- Plain queries: up to 14× faster
- Single-word queries: up to 3.5× faster
- Negated queries: up to 5.5× faster
Indexing is faster too! You can expect improvements from anywhere between 10% and 20% 🥳 🚀
A new query cache
Loupe now ships with a query cache which you can configure (see docs for details) but out of the box it will automatically use APCu if available. It will make subsequent searches (e.g. typeahead scenarios etc.) faster by caching intermediate results. In other words: if you have APCu already available then without any changes, Loupe will be even faster for these use cases! 🚀
Changelog
- Make max values per facet configurable by @Toflar in #299
- Added support for a query cache with APCu support out-of-the-box by @Toflar in #296
- PHPBench by @daun in #300
- Use shared candidate document set by @daun in #301
- Make benchmarks more stable by @Toflar in #302
- Performance improvements by @Toflar in #303
- Optimize multi-token relevance CTE aggregation in search by @Toflar in #304
- Calculate exactness data once per term by @daun in #305
- Increase term batch size to 16k for faster indexing by @Toflar in #306
- Skip superfluous group-by for dedup by @daun in #307
- Skip redundant where clause already enforced by join by @daun in #308
- Add missing indexes for cleanup queries by @Toflar in #309
- Skip document-orphan cleanup during add/update indexing by @Toflar in #310
- Skip redundant candidate-doc filter for single-token queries by @Toflar in #311
- Disable index benchmark warmups to fix update bench by @daun in #312
- Skip tokenization for unchanged docs by @daun in #313
- Skip start and end columns unless requested by @daun in #315
- Analyze database to help query planner by @daun in #314
- Fix phrase group search by @daun in #316
- Cache built filters in query cache by @Toflar in #318
- Fix a little typo in searching.md by @hirasso in #319
New Contributors
Full Changelog: 0.13.17...0.13.18
0.13.17
🚨 This release marks a shift in how Loupe versions are released. Until now, 0.x releases were primarily used for bug fixes, while new features often required waiting for a new minor version — forcing users to update dependencies more frequently than necessary.
Going forward, we’ll also ship new features in 0.x releases (marked with 🎉 below). New 0.x versions will only be released when there are backward compatibility breaks, making upgrades smoother and reducing unnecessary dependency updates.
New features
Bugfixes
- Document preview-attribute fallback for unmatched cropped content by @Toflar in #297
- Fix reindex crash when primary key is excluded from displayed attributes by @Toflar in #298
Full Changelog: 0.13.16...0.13.17