PostgreSQL在JSON数组元素中创建索引

时间:2016-10-04 11:42:44

标签: sql json postgresql indexing jsonb

我正在使用PostgreSQL 9.5,我想为JSON对象的多个字段创建索引。我展示了两个例子,第一个是工作,我被困在第二个。

  • 示例1 - 工作

以下代码:

CREATE TABLE product(id SERIAL, description JSONB);

INSERT INTO product(id, description) VALUES(1, '{"category":"shoes","name":"red women shoes","brand":"nike"}');
INSERT INTO product(id, description) VALUES(2, '{"category":"shoes","name":"women heels shoes","brand":"red valentino"}');

CREATE INDEX "product_description_idx" ON product USING GIN(to_tsvector('english', (description->>'name') || ' ' || (description->>'category')));

SELECT * from product WHERE to_tsvector('english', (description->>'name') || ' ' || (description->>'category')) @@ to_tsquery('shoes & red');

我只输出产品 id = 1,这是正确的。

  • 示例2 - 这里是我被困的地方

对于同一个表,但这次描述是一个对象数组:

CREATE TABLE product(id SERIAL, description JSONB);

INSERT INTO product(id, description) VALUES(1, '[{"category":"shoes","name":"red women shoes","brand":"nike"}, {"category":"hat","name":"white hat","brand":"nike"}]');
INSERT INTO product(id, description) VALUES(2, '[{"category":"shoes","name":"women heels shoes","brand":"red valentino"}, {"category":"dress","name":"maxi dress","brand":"red valentino"}]');

如何使用JSON数组的所有对象的名称描述创建索引(如示例1所示)?

注意:我只想创建包含名称描述这两个字段的索引,因为如果字段品牌是其中的一部分该指数也将作为结果返回产品 id = 2,这不应该发生。

我搜索了类似的问题,例如Index for finding an element in a JSON arrayHow do I query using fields inside the new PostgreSQL JSON datatype?,但我无法找到解决方案。

谢谢, 塞尔吉奥

0 个答案:

没有答案