query_default_field index parameter

Set the query_default_field index parameter to a column name to override the default field for basic text search queries from the contents field. Set the query_default_field index parameter to * to separately index each column in a composite index.

You do not need to specify the default field in a basic text search query. If you have a structured index on JSON or XML data, you can change the default field to one of the indexed field names or tags.

You can create a composite bts index on multiple text columns. By default, columns are concatenated and indexed as a single string in the contents field. Regardless of which column name you specify in the query, the matching text from all the indexed columns is returned. You can use the query_default_field="*" index parameter to index each column separately so that you can query by column name, which becomes the index field name. When you use the query_default_field="*" index parameter, only the matching text from the column name that you specify in the query is returned. You query multiple columns by including their field names in the format fieldname:string.

You cannot create a composite index on JSON or BSON columns.

If you combine the query_default_field="*" index parameter with the xmltags index parameter, the composite index is created on only the XML columns.

Examples: Create composite indexes

The following examples use a table with the following structure:

CREATE TABLE address(
    fname      char(32),
    lname      char(32),
    address1   varchar(64),
    address2   varchar(64),
    city       char(32),
    province   char(32),
    country    char(32),
    postalcode char(10)
);

You can create a composite bts index on multiple columns in the address table by using the following statement, which matches each column data type with its corresponding operator class:

CREATE INDEX  bts_idx ON address(
    fname      bts_char_ops,
    lname      bts_char_ops,
    address1   bts_varchar_ops,
    address2   bts_varchar_ops,
    city       bts_char_ops,
    province   bts_char_ops,
    country    bts_char_ops,
    postalcode bts_char_ops) USING bts;

The resulting composite index concatenates all the columns into the contents field. The following two queries would produce the same results because the text is not indexed by column name:

SELECT * FROM address WHERE bts_contains(fname, 'john');
SELECT * FROM address WHERE bts_contains(address1, 'john'); 

Alternatively, you can create a composite bts index and specify that each column is indexed separately by including the query_default_field="*" index parameter:

CREATE INDEX  bts_idx ON address(
    fname      bts_char_ops,
    lname      bts_char_ops,
    address1   bts_varchar_ops,
    address2   bts_varchar_ops,
    city       bts_char_ops,
    province   bts_char_ops,
    country    bts_char_ops,
    postalcode bts_char_ops) USING bts (query_default_field="*");

The resulting composite index includes the column name with the indexed text. The following two queries would produce different results:

SELECT * FROM address WHERE bts_contains(fname, 'john');
SELECT * FROM address WHERE bts_contains(address1, 'john'); 

The first query finds matches for john in the fname column and the second query finds matches for john in the address1 column.

The following example searches for a row that contains specific text in two of its columns:

SELECT * FROM address WHERE bts_contains(fname, 'john AND city:nipigon'); 

This query returns the rows that contain both john in the fname column and nipigon in the city column.