我有大约 2 亿条记录的物化视图,想在“全名”字段中添加索引以加快搜索速度。名称数据是这样存储的;
| full_names |
-----------------------------------------------------------------
| Smith, John | Doe, Jane, | Doe, John |
| Smith, James| Smith, Clare, | Doe, John |
| Adams, John | Doe, Jane, | Doe, Steven |
由于我的搜索词使用“ILIKE”和“%”,因此传统的 btree 索引将不起作用。我原本打算使用以下内容使用三元组索引:
CREATE INDEX idx_full_names_trgm_gist ON sample_table USING gisy(full_names gist_trgm_ops);
但收到此错误:
ERROR: index row requires 10216 bytes, maximum size is 8191
我的下一个想法是给我们一个 ts_vector 但我的理解是 ts_vector 将单词分解为字典定义的词位。我认为这不适用于名称,因为它们不是字典中的单词?
关于索引这些数据以进行快速搜索的最佳方法有什么建议吗?
这些数据大部分是静态的,不会定期更新。由于服务器上的限制,Solr 等外部搜索工具目前不是一个选项,因此我希望使用 postgres 的本机功能。
Postgres 9.5/RHEL 6.8
尝试使用 gin_trgm_ops 而不是 GiST 构建 GIN 索引。我从未发现 GiST 对 trgm 索引有用。
就是说,如果您因该消息而失败,则您的表中可能有一些奇怪的数据需要清理。你能找出是哪一行导致了问题吗?(如果不是,首先从最长的记录开始作为最有可能的嫌疑人)