在不同的索引上以不同的阈值利用 GiST 索引

Having the GiST indexes being exploited with different thresholds on different indexes

提问人:Andrea Salicetti 提问时间:11/17/2023 更新时间:11/19/2023 访问量:40

问:

Postgresql FTS / GiST 索引使用问题。

让我们开始说 的全局值是 0.9pg_trgm.similarity_threshold

SHOW pg_trgm.similarity_threshold;

pg_trgm.similarity_threshold|
----------------------------+
0.9                         |

我有这两个示例表:

桌子t1
编号 描述
1 <一些文字>
2 ...
桌子t2
编号 名字
1 <其他一些文本>
2 ...

两者都是具有自己的 GIST 索引的列:t1#descriptiont2#nametext

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?

PostgreSQL 索引 全文搜索

评论

1赞 nbk 11/17/2023
在进行查询之前更改阈值
0赞 Andrea Salicetti 11/17/2023
所以你建议我:在执行查询之前?此声明是在全球范围内有效还是仅在当前会话中有效?我担心同时运行 q1 和 q2 的并行查询......sql SET pg_trgm.similarity_threshold = 0.6;
0赞 Andrea Salicetti 11/17/2023
我回答了最后一个问题:它只会影响当前会话。
0赞 nbk 11/17/2023
据我了解手册,这将是会话,但您需要对其进行测试

答:

1赞 jjanes 11/17/2023 #1

在任何情况下,这都不适用于您的示例,因为您需要使用运算符而不是函数来获取pg_trgm中的索引使用情况。此外,您正在执行的操作不会使用您设置的阈值,因为该阈值属于不同的事物。

没有规定像这样附加不同的门槛。您需要在运行查询之间更改阈值。如果将查询打包到函数调用中,则可以安排它自动发生。但是,您仍然无法在同一查询中的不同站点使用不同的阈值。

有人提议通过制作一个运算符的变体来放宽这种情况,该运算符同时接受目标字符串和捆绑到复合类型中的阈值,但我认为该提议从未出现过。此外,它不会执行您要求的操作,因为阈值将附加到查询文本中的特定调用站点,而不是索引。

评论

1赞 JGH 11/18/2023
似乎可以在单个查询中使用 2 个阈值:stackoverflow.com/questions/49941564/...
0赞 jjanes 11/19/2023
@JGH哇,这看起来令人印象深刻,但很脆弱。我不知道每次更改何时开始,或者序列是否会因版本而异,或者只是由于添加其他连接/条件而导致计划结构发生不可预测的变化。