Skip to content

Loupe 1.0 馃帀馃帀馃帀

Choose a tag to compare

@Toflar Toflar released this 30 Jul 09:07
· 3 commits to main since this release

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.0

Thank 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! 馃コ