组合索引

您可以对多个文本列创建单个 bts 索引。

如果创建组合索引,那么缺省情况下所有索引列将在 contents 字段中合并在一起并作为单个字符串建立索引。无论您在查询中指定的是哪个列名,都将返回所有列中的匹配文本。

您可以使用 query_default_field="*" 索引参数对每个列单独建立索引,以便可以按列名查询,而该列名将成为索引字段名。仅返回您在查询中指定的列名中的匹配文本。通过以 fieldname:string 格式包括多个列的字段名,您可以查询多个列。

示例

以下示例使用带有以下结构的表:

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)
);

通过使用以下语句,您可以对 address 表中的多个列创建组合 bts 索引,使每种列数据类型与其相应的运算符类匹配:

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;

生成的组合索引将所有列合并到 contents 字段中。以下两个查询将生成相同的结果,因为未按列名对文本建立索引:

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

或者,也可以创建组合 bts 索引并通过包含 query_default_field="*" 索引参数来指定对每个列分别建立索引:

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="*");

生成的组合索引包括带有索引文本的列名。以下两个查询将生成不同的结果:

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

第一个查询在 fname 列中查找 john 的匹配项,而第二个查询在 address1 列中查找 john 的匹配项。

以下示例搜索在其两个列中包含特定文本的行:

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

此查询返回在 fname 列中包含 john 且在 city 列中包含 nipigon 的行。