zulip/docs/subsystems/full-text-search.md

3.7 KiB

Full-text search

Zulip supports full-text search, which can be combined arbitrarily with Zulip's full suite of narrowing operators. By default, it only supports English text, but there is an experimental PGroonga integration that provides full-text search for all languages.

The user interface and feature set for Zulip's full-text search is documented in the "Search operators" documentation section in the Zulip app's gear menu.

The default full-text search implementation

Zulip's uses PostgreSQL's built-in full-text search feature, with a custom set of English stop words to improve the quality of the search results.

We use a small extension, tsearch_extras, for highlighting of the matching words. There is some discussion of removing this extension, at least as an option, so that Zulip can be used with database-as-a-service platforms.

In order to optimize the performance of delivering messages, the full-text search index is updated for newly sent messages in the background, after the message has been delivered. This background updating is done by puppet/zulip/files/postgresql/process_fts_updates, which is usually deployed on the database server, but could be deployed on an application server instead.

An optional full-text search implementation

Zulip now supports using PGroonga for full-text search. PGroonga is a PostgreSQL extension that provides full-text search feature. PostgreSQL's built-in full-text search feature supports only one language at a time (in Zulip's case, English). PGroonga supports all languages simultaneously, including Japanese, Chinese and so on, all at once. We expect to migrate Zulip's full-text search to only support PGroonga once we have tested this new extension fully.

The following processes should be executed as the root user. Run:

sudo -i

How to enable full-text search across all languages

This section describes how to enable using PGroonga to back the full-text search feature.

To install PGroonga, add pgroonga = enabled in the [machine] section in /etc/zulip/zulip.conf:

[machine]
...
pgroonga = enabled

And then run as root:

/home/zulip/deployments/current/scripts/zulip-puppet-apply

Then, add USING_PGROONGA = true in /etc/zulip/settings.py:

USING_PGROONGA = True

And apply the PGroonga migrations:

cd /srv/zulip
./manage.py migrate pgroonga

Note that the migration may take a long time, and you can't send new messages until the migration finishes.

Once the migrations are complete, restart Zulip:

su zulip -c '/home/zulip/deployments/current/scripts/restart-server'

Now, you can use full-text search across all languages.

How to disable full-text search across all languages

This section describes how to disable full-text search feature based on PGroonga.

If you want to fully remove PGroonga, first you need to remove the PGroonga column (as above, this will take a long time and no messages can be sent while it is running). If you intend to re-enable PGroonga later, you can skip this step (at the cost of your Message table being slightly larger than it would be otherwise).

/home/zulip/deployments/current/manage.py migrate pgroonga zero

Then, set USING_PGROONGA = False in /etc/zulip/settings.py:

USING_PGROONGA = False

And, restart Zulip:

su zulip -c '/home/zulip/deployments/current/scripts/restart-server'

Now, full-text search feature based on PGroonga is disabled. If you'd like, you can also remove the pgroonga = enabled line in /etc/zulip/zulip.conf and uninstall the pgroonga packages.