在不同索引上使用不同阈值来利用 GiST 索引

问题描述 投票:0回答:1

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
执行相似性查询,但阈值不同怎么办?

查询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

作为

pg_trgm.similarity_threshold
全局参数,GIST 索引将仅在第一个查询中使用。

如何实现这一点,使两个 GIST 索引同时用于查询 1 和查询 2?

postgresql indexing full-text-search
1个回答
0
投票

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

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

有一个提案通过制作一个运算符的变体来放松这种情况,该变体接受目标字符串和复合类型上的阈值,但我认为该提案不会有任何进展。此外,它不会执行您要求的操作,因为阈值将附加到查询文本中的特定调用站点,而不是索引。

© www.soinside.com 2019 - 2024. All rights reserved.