我将OpenStreetMap 的planet.osm 文件大面积导入到postgresql 数据库中。数据库包含一个称为节点的表。每个节点都有一个名为 geom 的几何列和一个名为 tags 的 hstore 列。我需要沿着标记列中具有某些键的线提取节点。为此,我使用以下查询:
SELECT id, tags
FROM nodes
WHERE ST_DWithin(nodes.geom, ST_MakeLine('{$geom1}', '{$geom2}'), 0.001)
AND tags ? '{$type}';
Run Code Online (Sandbox Code Playgroud)
$geom1 和 $geom2 是我的线的起点和终点的几何图形。
$type 变量包含我要搜索的键。现在,它可以具有以下值之一:“historic”或“tourist”。
上面给出的查询有效,但速度太慢。我想在标签列中搜索键需要太多时间。我阅读了 GIN 和 GIST 索引,并使用以下查询生成了 GIN 索引:
CREATE INDEX nodes_tags_idx ON nodes USING GIN(tags);
Run Code Online (Sandbox Code Playgroud)
创建索引后,我使用相同的第一个查询再次搜索节点,但性能没有变化。
如何正确使用 GIN 和 GIST 来索引标签列,以便我可以更快地搜索在标签列中具有特定键的节点?
谢谢