Queries that contain multiple etx_contains() operators

If you specify the etx_contains() operator in a query, the operator must be able to scan the index. If you execute a query and no etx index is available, the module returns an error.

This affects how complex queries must be written. For example, suppose you are interested in finding recipes that mention lemon zest or ingredients that include orange rind. Two separate etx_contains() operators must be used in the query. Unfortunately, the following type of query returns an error because the database server cannot use a single index scan for the two etx_contains() operators:
SELECT id FROM recipes 
    WHERE etx_contains(recipe, Row ('lemon zest', 'SEARCH_TYPE = PHRASE_EXACT'))
    OR
          etx_contains(ingredients, Row ('orange rind', 'SEARCH_TYPE = PHRASE_EXACT'));
The query must be rewritten into two separate queries combined with the UNION operator, as shown in the following example:
SELECT id FROM recipes 
    WHERE etx_contains(recipe, Row ('lemon zest', 'SEARCH_TYPE = PHRASE_EXACT'))
UNION
SELECT id FROM recipes 
    WHERE etx_contains(ingredients, Row ('orange rind', 'SEARCH_TYPE = PHRASE_EXACT'));
Similarly, an AND clause involving two etx_contains() operators returns an error. The alternative is to rewrite the query as shown by the following example:
SELECT id FROM recipes 
    WHERE etx_contains(recipe, Row ('lemon zest', 'SEARCH_TYPE = PHRASE_EXACT'))
AND id IN
 (SELECT id FROM recipes 
    WHERE etx_contains(ingredients, Row ('orange rind', 'SEARCH_TYPE = PHRASE_EXACT')));

The query plan for this type of query shows a semi-join of the result of the two index scans. Another alternative is to use two table aliases for the same table and to join the table to itself through a unique column.

It is possible to execute multiple etx_contains() operators against more than one column in the same or multiple tables as long as you do not specify them in the same WHERE clause. Examine the query plan to make sure that the database server has selected index scans for the etx_contains() operator.