您可以对多个文本列创建单个 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 的行。