Postgresql FTS / GiST 索引使用问题。
让我们开始说
pg_trgm.similarity_threshold
的全局值为 0.9:
SHOW pg_trgm.similarity_threshold;
pg_trgm.similarity_threshold|
----------------------------+
0.9 |
我有这两个示例表:
t1
id | 描述 |
---|---|
1 | |
2 | ... |
t2
id | 名字 |
---|---|
1 | |
2 | ... |
t1#description
和t2#name
都是具有自己的GIST索引的text
列:
CREATE INDEX gist_index_t1 ON t1 USING gist (description gist_trgm_ops);
CREATE INDEX gist_index_t1 ON t2 USING gist (name gist_trgm_ops);
如果两者执行的相似度查询相同,并且阈值与全局阈值(0.9)相同,则使用索引。
如果我需要对
t2
执行相似性查询,但阈值不同怎么办?
SELECT *
FROM t1
WHERE strict_word_similarity('a text', description) > 0.9
SELECT *
FROM t2
WHERE strict_word_similarity('a text', name) > 0.6
作为
pg_trgm.similarity_threshold
全局参数,GIST 索引将仅在第一个查询中使用。
如何实现这一点,使两个 GIST 索引同时用于查询 1 和查询 2?
这在任何情况下都不适用于您的示例,因为您需要使用运算符而不是函数来获取 pg_trgm 中的索引使用情况。另外,您正在执行的操作不会使用您设置的阈值,因为该阈值属于不同的事物。
没有规定附加不同的阈值。您需要更改运行查询之间的阈值。如果将查询打包到函数调用中,则可以安排它自动发生。但您仍然无法在同一查询中的不同站点使用不同的阈值。
有一个提案通过制作一个运算符的变体来放松这种情况,该变体接受目标字符串和复合类型上的阈值,但我认为该提案不会有任何进展。此外,它不会执行您要求的操作,因为阈值将附加到查询文本中的特定调用站点,而不是索引。