如何使用部分字段搜索正确构建多列索引

时间:2016-11-21 20:52:41

标签: postgresql

使用full_name列和州列设置多列索引的最佳方法是什么?搜索将使用精确状态,并在full_name列上进行部分搜索。查询将是这样的:

WHERE full_name ~* 'jones' AND state = 'CA';

搜索大约2000万条记录。

谢谢!

约翰

1 个答案:

答案 0 :(得分:0)

状态似乎足够直接 - 正常指数应该足够了。至于全名搜索,这是一项很多工作,但有2000万条记录,我认为红利会说明一切。

在表格中创建一个新字段作为tsvector,并为此示例调用它full_name_search

alter table <blah> add column full_name_search tsvector;

列的初始填充:

update <blah>
set full_name_search = to_tsvector (full_name);

如果可能,请将该字段设为不可为空。

创建一个触发器,无论何时更新,它都会自动填充该字段:

create trigger <blah>_insert_update
before insert or update on <blah>
for each row execute procedure
    tsvector_update_trigger(full_name_search,'pg_catalog.english',full_name);

在新字段上添加索引:

create index <blah>_ix1 on <blah>
using gin(full_name_search);

从此处重新构建查询以搜索tsvector字段而不是文本字段:

WHERE full_name_search @@ to_tsquery('jones') AND state = 'CA';

您可以在其中一些步骤中使用快捷方式(例如,不要创建额外的字段,而是使用基于函数的索引),它会提高您的性能,但不如您可以得到的那样好

一个警告 - 我认为to_tsvector将根据内容中的逻辑中断拆分为矢量组件,因此:

Catherine Jones Is a Nice Lady

会很好,但是这个:

I've been Jonesing all day

可能不会。