valign="middle" morerows="17"><literal>range_ops</literal></entry>
<entry><literal>= (anyrange, anyrange)</literal></entry>
<entry valign="middle" morerows="17"></entry>
</row>
<row><entry><literal>&& (anyrange, anyrange)</literal></entry></row>
<row><entry><literal>&& (anyrange, anymultirange)</literal></entry></row>
<row><entry><literal>@> (anyrange, anyelement)</literal></entry></row>
<row><entry><literal>@> (anyrange, anyrange)</literal></entry></row>
<row><entry><literal>@> (anyrange, anymultirange)</literal></entry></row>
<row><entry><literal><@ (anyrange, anyrange)</literal></entry></row>
<row><entry><literal><@ (anyrange, anymultirange)</literal></entry></row>
<row><entry><literal><< (anyrange, anyrange)</literal></entry></row>
<row><entry><literal><< (anyrange, anymultirange)</literal></entry></row>
<row><entry><literal>>> (anyrange, anyrange)</literal></entry></row>
<row><entry><literal>>> (anyrange, anymultirange)</literal></entry></row>
<row><entry><literal>&< (anyrange, anyrange)</literal></entry></row>
<row><entry><literal>&< (anyrange, anymultirange)</literal></entry></row>
<row><entry><literal>&> (anyrange, anyrange)</literal></entry></row>
<row><entry><literal>&> (anyrange, anymultirange)</literal></entry></row>
<row><entry><literal>-|- (anyrange, anyrange)</literal></entry></row>
<row><entry><literal>-|- (anyrange, anymultirange)</literal></entry></row>
<row>
<entry valign="middle" morerows="1"><literal>tsquery_ops</literal></entry>
<entry><literal><@ (tsquery, tsquery)</literal></entry>
<entry valign="middle" morerows="1"></entry>
</row>
<row><entry><literal>@> (tsquery, tsquery)</literal></entry></row>
<row>
<entry valign="middle"><literal>tsvector_ops</literal></entry>
<entry><literal>@@ (tsvector, tsquery)</literal></entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
For historical reasons, the <literal>inet_ops</literal> operator class is
not the default class for types <type>inet</type> and <type>cidr</type>.
To use it, mention the class name in <command>CREATE INDEX</command>,
for example
<programlisting>
CREATE INDEX ON my_table USING GIST (my_inet_column inet_ops);
</programlisting>
</para>
</sect2>
<sect2 id="gist-extensibility">
<title>Extensibility</title>
<para>
Traditionally, implementing a new index access method meant a lot of
difficult work. It was necessary to understand the inner workings of the
database, such as the lock manager and Write-Ahead Log. The
<acronym>GiST</acronym> interface has a high level of abstraction,
requiring the access method implementer only to implement the semantics of
the data type being accessed. The <acronym>GiST</acronym> layer itself
takes care of concurrency, logging and searching the tree structure.
</para>
<para>
This extensibility should not be confused with the extensibility of the
other standard search trees in terms of the data they can handle. For
example, <productname>PostgreSQL</productname> supports extensible B-trees
and hash indexes. That means that you can use
<productname>PostgreSQL</productname> to build a B-tree or hash over any
data type you want. But B-trees only support range predicates
(<literal><</literal>, <literal>=</literal>, <literal>></literal>),
and hash indexes only support equality queries.
</para>
<para>
So if you index, say, an image collection with a
<productname>PostgreSQL</productname> B-tree, you can only issue queries
such as <quote>is imagex equal to imagey</quote>, <quote>is imagex less
than imagey</quote> and <quote>is imagex greater than imagey</quote>.
Depending on how you define <quote>equals</quote>, <quote>less than</quote>
and <quote>greater than</quote>