假设我有一个包含多列的表。例如:
id int
name text
surname text
cars json
示例记录将是
+----+------+---------+------------------------------------+
| id | name | surname | cars |
+----+------+---------+------------------------------------+
| 1 | John | Doe | {"values":["Ford", "BMW", "Fiat"]} |
+----+------+---------+------------------------------------+
我想搜索所有这些表数据的相关性,如下所示:
select *,
similarity(
'Malcolm Joe likes Ferrary, but hates BMW',
(name || (cars ->> 'values') || surname)
) sim
from public.test_table
where similarity(
'Malcolm Joe likes Ferrary, but hates BMW',
(name || (cars ->> 'values') || surname)
) > 0.05
order by sim desc;
有什么方法可以加快搜索速度吗?创建三元索引?如果是这样 - 如何更好地创造它?在一列上,在每一列上,在连接表达式上?另外,我不明白哪种类型的索引更好——GIN 或 GiST。我读过 GIN 通常更适合常规全文搜索,但 GiST 更适合 trigram 搜索。那是对的吗?
我还想问是否有更好的方法来编写上述查询?
如果有人想知道我为什么选择 trigram 而不是常规的全文搜索 - 这是因为搜索字符串将来自处理一些用户输入,因此可能会出现错误,甚至可能会出现错误,甚至会出现英文“o”或“c”被西里尔字母替换的情况。我的数据库记录或搜索也可以包含字母数字数据,这也可以用三元组更好地处理。