查找关键字与pg引用数组中的任何引用相似的行

时间:2014-11-17 10:24:53

标签: postgresql

假设我有这个项目表和一列类型为 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

1 个答案:

答案 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索引。