Tuning Postgres Fulltext search
该表是产品:
1 2 3 4 5 | TABLE"public.product" COLUMN | TYPE | -----------------+--------------------------+ id | uuid | attributes | jsonb | |
请注意,属性是
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 |
这是不可取的,有没有办法只返回匹配的行?
您需要将条件移动到
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中查询数组结构的正确索引是什么?
但是,如果您想一次搜索键和值,那就不会起作用了。
使用规范化的表格布局可能会更好...