提问人:Andrea Salicetti 提问时间:11/17/2023 更新时间:11/19/2023 访问量:40
在不同的索引上以不同的阈值利用 GiST 索引
Having the GiST indexes being exploited with different thresholds on different indexes
问:
Postgresql FTS / GiST 索引使用问题。
让我们开始说 的全局值是 0.9:pg_trgm.similarity_threshold
SHOW pg_trgm.similarity_threshold;
pg_trgm.similarity_threshold|
----------------------------+
0.9 |
我有这两个示例表:
桌子t1
编号 | 描述 |
---|---|
1 | <一些文字> |
2 | ... |
桌子t2
编号 | 名字 |
---|---|
1 | <其他一些文本> |
2 | ... |
两者都是具有自己的 GIST 索引的列:t1#description
t2#name
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);
如果对两者执行的相似性查询相同,并且两者的阈值相同,则使用索引。
如果我需要对 执行相似性查询,但阈值不同,该怎么办?t2
查询 1
SELECT *
FROM t1
WHERE strict_word_similarity('a text', description) > 0.9
查询 2
SELECT *
FROM t2
WHERE strict_word_similarity('a text', name) > 0.6
作为全局参数,GIST 索引将仅在第一个查询中使用。pg_trgm.similarity_threshold
如何实现这一点,使两个 GIST 索引同时用于查询 1 和查询 2?
答:
1赞
jjanes
11/17/2023
#1
在任何情况下,这都不适用于您的示例,因为您需要使用运算符而不是函数来获取pg_trgm中的索引使用情况。此外,您正在执行的操作不会使用您设置的阈值,因为该阈值属于不同的事物。
没有规定像这样附加不同的门槛。您需要在运行查询之间更改阈值。如果将查询打包到函数调用中,则可以安排它自动发生。但是,您仍然无法在同一查询中的不同站点使用不同的阈值。
有人提议通过制作一个运算符的变体来放宽这种情况,该运算符同时接受目标字符串和捆绑到复合类型中的阈值,但我认为该提议从未出现过。此外,它不会执行您要求的操作,因为阈值将附加到查询文本中的特定调用站点,而不是索引。
评论
1赞
JGH
11/18/2023
似乎可以在单个查询中使用 2 个阈值:stackoverflow.com/questions/49941564/...
0赞
jjanes
11/19/2023
@JGH哇,这看起来令人印象深刻,但很脆弱。我不知道每次更改何时开始,或者序列是否会因版本而异,或者只是由于添加其他连接/条件而导致计划结构发生不可预测的变化。
评论
sql SET pg_trgm.similarity_threshold = 0.6;