# Tsearch2 Full-text Search Engine Driver for OpenACS 5.x

Tsearch2 Driver provides full-text searching of a PostgreSQL database by using PostgreSQL's tsearch2 FtsEngineDriver

## Requirements for this search implementation

- OpenACS 5.x
- PostgreSQL 7.3 or newer
- PostgreSQL's tsearch2 module installed. (Pg versions 7.3 and 7.4 require a patch and tsearch2.sql to be loaded into the database)
- This package installed
- search package to be mounted somewhere.
- FtsEngineDriver parameter of search package set to "tsearch2-driver".
- indexing some data

## Install OpenACS' Tsearch2 Full-Text Search Package

1. If you have not yet, install PostgreSQL's tsearch2 module.

2. Click `Admin` on the top of the default home page. If prompted, log in with the account and password you entered during install.

3. Click on the `Install software` link.

4. Click on the `Install new service` link.

5. Click on the `Install` link next to Tsearch2 Driver. If you have installed tsearch2 into your PostgreSQL database, the installer will automatically enable tsearch in your OpenACS database instance.

6. Restart AOLserver. Wait a minute, then browse back to the home page.

7. Click on `Admin` on the top of the screen.

8. Click on `Main Site Administration` in the "Subsite Administration" section.

9. Click on `Site Map` in the "Advanced Features" section.

10. Mount the Search interface in the site-map.

    1. Click the `new sub folder` link on the Main Site line.

    2. Type `search` and click `New`.

    3. Click the `new application` link on the `search` line.

    4. Type `search` where it says `untitled`, choose `search` from the drop-down list, and click `New`.

    5. Click the `Parameters` link next to the Search package instance.

    6. Type `tsearch2-driver` where it says `openfts-driver` in the `FtsEngineDriver` parameter.

11. Restart AOLserver. Wait a minute, then click on `Main Site` at the top of the page.

### Enable Full Text Search in packages

Weblogger (lars-blogger), ETP (edit-this-page), and a few other packages have code to generate indexed content. We are using lars-blogger to illustrate how to enable Full Text Search in packages.

1. Install the lars-blogger package, if it is not yet installed.

   1. Click `Admin` on the top of the default home page. If prompted, log in with the account and password you entered during install.

   2. Click on the `Install software` link.

   3. Click on the `Install new application` link.

   4. Click on the `Install` link next to Weblogger.

   5. Install all required packages as well (always say okay until you shall restart the server)

2. Loading the service contracts datamodel and enabling the service contract usually happens when the package is installed. However, Lars-blogger may require manually loading lars-blogger-sc-create.sql to get it to register the service contract implementation that indexes the content:

       [$OPENACS_SERVICE_NAME $OPENACS_SERVICE_NAME]$ cd packages/lars-blogger/sql/postgresql
       [$OPENACS_SERVICE_NAME postgresql]$ psql $OPENACS_SERVICE_NAME -f lars-blogger-sc-create.sql

3. Restart AOLserver.

Full Text Search should be enabled now, if not consult http://openacs.org/forums/message-view?message_id=154759. This link also contains some hints on how to make sure it is enabled.

## Indexing data

Once tsearch2-driver is installed, add some content to be indexed.

### Adding search indexing to packages

Standard coding practice is to put indexing code in package-key/sql/postgresql/package-key-sc-create.sql. View these examples for how to implement:

- packages/edit-this-page/sql/postgresql/edit-this-page-sc-create.sql
- packages/lars-blogger/sql/postgresql/lars-blogger-sc-create.sql

## Indexing pre-existing content that has been indexed before

If your pre-existing content has been indexed before (e.g. because the search package was mounted before as part of a previous search service), you have to tell the search package to reindex:

        insert into search_observer_queue (
                select my_id, now(),'INSERT' from my_table
                );

For forums and ETP this looks like:

        insert into search_observer_queue (
                select message_id, now(), 'INSERT' from forums_messages
                );
        insert into search_observer_queue (
                select live_revision, now(), 'INSERT' from (
                        select live_revision from cr_items where content_type = 'etp_page_revision'
                        )
                etp );

## Implementation notes

This version includes only the most basic features. Many options are possible by adding admin configurable parameters. The current service contract definitions are not flexible enough to work well with every possible search driver, so some features may require making some improvements to the search package also.

Dave Bauer dave@thedesignexperience.org 2004-06-05