假设我有这个项目表和一列类型为 vary(255)[] 的名为reference的列。此列还有一个索引(GIN)。这里的想法是轻松存储对同一项目的多个引用。
现在,我想搜索任何引用类似于我的关键字的项目。
示例:
项目A有参考文献[foobar,bazbaz]。 如果我只搜索'foo%'或'baz%',它也应该找到项目A.
如何使用索引而不进行全表搜索?
更新
由于我找不到这个问题的答案,所以我选择了某种解决方法:
SELECT * FROM items WHERE
references[1] LIKE :keyword OR
references[2] LIKE :keyword OR
references[3] LIKE :keyword
答案 0 :(得分:0)
似乎你需要别名搜索。使用PostgreSQL内置的FTS(全文搜索)实现通常很方便。我会很好地描述它。
CREATE TABLE test.entity (pkey SERIAL NOT NULL, description text);
然后我们创建别名表。我们的目标是将原始实体与其别名分开。
CREATE TABLE test.aliases (
talias tsquery NOT NULL,
tentity tsquery,
CONSTRAINT aliases_pkey PRIMARY KEY (talias)
);
让我们插入一些值
INSERT INTO test.entity (description) VALUES ('test');
INSERT INTO test.aliases VALUES (plainto_tsquery('test alias 1'), plainto_tsquery('test'));
INSERT INTO test.aliases VALUES (plainto_tsquery('test alias 2'), plainto_tsquery('test'));
现在只留下一个问题 - 如何搜索别名表?我们将使用ts_rewrite实时替换查询。
SELECT * FROM test.entity WHERE
(SELECT ts_rewrite(plainto_tsquery('test alias 1'), 'SELECT talias, tentity FROM test.aliases')) @@ to_tsvector(description);
pkey | description
-----+----------------
1 | test
请注意,您可以使用'别名'所有别名的表在您的系统中搜索,在基本实体表中使用tsvector类型而不是简单文本,并在其上创建gin索引。