For a functional index, an index is
defined on the result of a function applied to one or more
columns of a single table. Functional indexes can be used to
obtain fast access to data based on the result of function
calls.

For example, a common way to do case-insensitive comparisons
is to use the lower function:

SELECT * FROM test1 WHERE lower(col1) = 'value';

This query can use an index, if one has been defined on the
result of the lower(column)
operation:

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

The function in the index definition can take more than one
argument, but they must be table columns, not constants.
Functional indexes are always single-column (namely, the function
result) even if the function uses more than one input field;
there cannot be multicolumn indexes that contain function
calls.

Tip: The restrictions mentioned in the previous
paragraph can easily be worked around by defining a custom
function to use in the index definition that computes any
desired result internally.