Zulip's search is powered by this built-in Postgres full-text search feature, and it's been a fantastic experience. There's a few things I love about it:<p>* One can cheaply compose full-text search with other search operators by just doing normal joins on database indexes, which means we can cheaply and performantly support tons of useful operators (<a href="https://zulip.com/help/search-for-messages" rel="nofollow">https://zulip.com/help/search-for-messages</a>).<p>* We don't have to build a pipeline to synchronize data between the real database and the search database. Being a chat product, a lot of the things users search for are things that changed recently; so lag, races, and inconsistencies are important to avoid. With the Postgres full-text search, all one needs to do is commit database transactions as usual, and we know that all future searches will return correct results.<p>* We don't have to operate, manage, and scale a separate service just to support search. And neither do the thousands of self-hosted Zulip installations.<p>Responding to the "Scaling bottleneck" concerns in comments below, one can send search traffic (which is fundamentally read-only) to a replica, with much less complexity than a dedicated search service.<p>Doing fancy scoring pipelines is a good reason to use a specialized search service over the Postgres feature.<p>I should also mention that a weakness of Postgres full-text search is that it only supports doing stemming for one language. The excellent PGroonga extension (<a href="https://pgroonga.github.io/" rel="nofollow">https://pgroonga.github.io/</a>) supports search in all languages; it's a huge improvement especially for character-based languages like Japanese. We're planning to migrate Zulip to using it by default; right now it's available as an option.<p>More details are available here: <a href="https://zulip.readthedocs.io/en/latest/subsystems/full-text-search.html" rel="nofollow">https://zulip.readthedocs.io/en/latest/subsystems/full-text-...</a>