假设我有一套文档。每个文档都是一个无序的字符串
{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做这样的事情有可能吗?
如果有帮助的话 - 可以用一袋数字代替字符串。
答案 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!