Postgresql Postgres多列文本索引

Postgresql Postgres多列文本索引,postgresql,indexing,full-text-search,Postgresql,Indexing,Full Text Search,如果我有一个包含数百万条记录的表,并且我正在执行通配符搜索,那么我应该对所有列进行索引吗 例如: table.account_id = X AND (table.col1 LIKE '%abc%' OR table.col2 LIKE %abc% OR LOWER(table.col3) LIKE %abc% OR LOWER(table.col4) LIKE %abc%) 根据我搜索的内容,大约1-2秒后返回。但是,我需要它小于.5s,因为它是一个自动完

如果我有一个包含数百万条记录的表,并且我正在执行通配符搜索,那么我应该对所有列进行索引吗

例如:

table.account_id = X 
AND (table.col1 LIKE '%abc%' 
     OR table.col2 LIKE %abc% 
     OR LOWER(table.col3) LIKE %abc% 
     OR LOWER(table.col4) LIKE %abc%)
根据我搜索的内容,大约1-2秒后返回。但是,我需要它小于.5s,因为它是一个自动完成字段

我的问题是,我是否应该创建一个索引,例如:

CREATE INDEX ix_xxxx ON table (col1, col2,lower(col3),lower(col4), owner_firm_id)
或者我应该看看索引中的向量还是文本模式

我确实尝试了下面的方法,但没有达到<1s

CREATE INDEX ix_name ON table
            USING gist (col1 gist_trgm_ops, col2 gist_trgm_ops, LOWER(col3) gist_trgm_ops, col4 gist_trgm_ops, account_id);


如果执行子字符串搜索,请使用三元索引:

CREATE EXTENSION pg_trgm;

CREATE INDEX ON atable USING gin ((col1 || ' ' || col2 ... gin_trgm_ops);
然后像这样询问

WHERE col1 || ' ' || col2 || ... ILIKE '%abcd%'

为了获得良好的性能,在字符串长度达到4左右之前不要开始搜索。

GiST索引处理col4的方式与查询处理col4的方式不同。此外,GiST索引对列顺序很敏感,可以用最少的工作消除最多行的列应该放在第一位。这可能是帐户id:

CREATE INDEX ix_name ON table
   USING gist (account_id, col1 gist_trgm_ops, col2 gist_trgm_ops, LOWER(col3) gist_trgm_ops, lower(col4) gist_trgm_ops);
同一个索引只有GIN形式而不是GiST形式可能是有效的,您可以尝试两者并查看。这对索引中指定列的顺序不敏感

pg_trgm索引操作符同样支持LIKE和ILIKE。您不必对其中两列执行
lower
,而只需对原始列使用ILIKE而不是LIKE进行查询,并在原始列上构建索引。这可能不会对性能造成太大的改变,但更简单的索引会更灵活

但在查询中是否真的有必要使用前导“%”?当人们从中间开始打字时,是否期望autocomplete起作用?

这一观察结果可能会(也可能不会)帮助你,但我建议你看看ElasticSearch。可能是您无法更改系统的体系结构,或者项目太遥远,无法考虑这样的更改,但是如果您有一些更改的自由,我建议您重新考虑。您的数据库可能是您构建ES索引的“一个真相来源”。ES的文本搜索性能将超过PG。