我正在使用PostgreSQL 9.5,我想为JSON对象的多个字段创建索引。我展示了两个例子,第一个是工作,我被困在第二个。
以下代码:
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,这是正确的。
对于同一个表,但这次描述是一个对象数组:
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 array和How do I query using fields inside the new PostgreSQL JSON datatype?,但我无法找到解决方案。
谢谢, 塞尔吉奥