最近邻的PostgreSQL GIN索引?

时间:2017-09-30 00:25:35

标签: postgresql indexing

假设我有一套文档。每个文档都是一个无序的字符串

{a, b, b, d}, {a, b}, {j, k, d, a}, ....

是否可以使用GIN查找与doc X类似的所有文档?作为相似性 - 使用余弦或欧几里德距离

我知道PostgreSQL提供了三元搜索。它与我想要的非常相似。但没有trigram。我想用自己的载体。

SELECT * from DOCS where content like {a, b, c}这样的东西。

INSERT INTO docs (content) VALUES ({i, j, k})
INSERT INTO docs (content) VALUES ({a})
INSERT INTO docs (content) VALUES ({b, c})
...

-- Somehow build GIN index over the docs.content field

SELECT * FROM docs WHERE content LIKE {a, b, c}

用GIN做这样的事情有可能吗?

如果有帮助的话 - 可以用一袋数字代替字符串。

1 个答案:

答案 0 :(得分:1)

您可以使用GIN索引检查数组是否包含另一个数组:

create table docs(content text[]);

insert into docs values ('{a,b}'),('{a,b,c}'),('{a,b,c,d}'), ('{a,c,d}'),('{a,b,d}');

create index on docs using gin(content);

select content from docs where content @> '{b,c}'; -- this can use the index

警告经纪人!

@>运算符可能无法按照预期的方式运行:它对数组的处理方式有点像...

select '{a}'  ::text[] @> '{a,a}'::text[]; -- true!
select '{a,b}'::text[] @> '{b,a}'::text[]; -- true!

相关文档主题