关于json:调整Postgres全文搜索

Tuning Postgres Fulltext search

该表是产品:

1
2
3
4
5
             TABLE"public.product"
     COLUMN      |           TYPE           |
-----------------+--------------------------+
 id              | uuid                     |
 attributes      | jsonb                    |

请注意,属性是jsonb字段。 目前我有~5k行,我这样查询它:

1
SELECT id, to_tsvector(attributes::text) @@ to_tsquery('22222') FROM product;

这个查询已经需要几秒钟才能完成,我想知道是否有什么可以改善那段时间,即索引或改进的查询?

要启动此查询,请返回:

1
2
3
4
5
6
7
                  id                  | found
--------------------------------------+-------
 a8230602-ff3f-4414-affc-3594abcfa617 | f
 da0c70d5-5108-42ea-941d-123589129feb | f
 24ac417a-466c-465c-b346-4fad7a9ad3d8 | f
 4bee6122-c5d7-4e0c-840e-e04c28888a9a | f
 ce5fe539-bcb2-4cec-9012-b2501df7012e | f

这是不可取的,有没有办法只返回匹配的行?


您需要将条件移动到WHERE子句:

1
2
3
SELECT *
FROM   product
WHERE  to_tsvector('english', attributes::text) @@ to_tsquery('22222');

并在表达式上创建一个全文索引:

1
2
CREATE INDEX textsearch_idx ON product
USING GIN (to_tsvector('english', attributes::text));

索引表达式和查询中的表达式必须匹配。

手册中的详细信息。

或者您可以使用jsonb GIN索引:

  • 在Postgres jsonb中查询数组结构的正确索引是什么?

但是,如果您想一次搜索键和值,那就不会起作用了。

使用规范化的表格布局可能会更好...