使用full_name列和州列设置多列索引的最佳方法是什么?搜索将使用精确状态,并在full_name列上进行部分搜索。查询将是这样的:
WHERE full_name ~* 'jones' AND state = 'CA';
搜索大约2000万条记录。
谢谢!
约翰
答案 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
可能不会。