X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/fea4dbba50d5a53ef982b1eb273e0bb81a2cd036..9fa73cfb1528147cc0b59d81b5c0cb1a9ed6789d:/lib-sql/tables.sql diff --git a/lib-sql/tables.sql b/lib-sql/tables.sql index 0c0f78fc..eafed6d8 100644 --- a/lib-sql/tables.sql +++ b/lib-sql/tables.sql @@ -45,7 +45,7 @@ GRANT SELECT ON TABLE country_name TO "{{config.DATABASE_WEBUSER}}"; DROP TABLE IF EXISTS nominatim_properties; CREATE TABLE nominatim_properties ( - property TEXT, + property TEXT NOT NULL, value TEXT ); GRANT SELECT ON TABLE nominatim_properties TO "{{config.DATABASE_WEBUSER}}"; @@ -80,9 +80,9 @@ CREATE TABLE location_property_tiger ( parent_place_id BIGINT, startnumber INTEGER, endnumber INTEGER, + step SMALLINT, partition SMALLINT, linegeo GEOMETRY, - interpolationtype TEXT, postcode TEXT); GRANT SELECT ON location_property_tiger TO "{{config.DATABASE_WEBUSER}}"; @@ -137,7 +137,9 @@ CREATE TABLE place_addressline ( ) {{db.tablespace.search_data}}; CREATE INDEX idx_place_addressline_place_id on place_addressline USING BTREE (place_id) {{db.tablespace.search_index}}; -drop table if exists placex; +--------- PLACEX - storage for all indexed places ----------------- + +DROP TABLE IF EXISTS placex; CREATE TABLE placex ( place_id BIGINT NOT NULL, parent_place_id BIGINT, @@ -157,20 +159,65 @@ CREATE TABLE placex ( postcode TEXT, centroid GEOMETRY(Geometry, 4326) ) {{db.tablespace.search_data}}; + CREATE UNIQUE INDEX idx_place_id ON placex USING BTREE (place_id) {{db.tablespace.search_index}}; -CREATE INDEX idx_placex_osmid ON placex USING BTREE (osm_type, osm_id) {{db.tablespace.search_index}}; -CREATE INDEX idx_placex_linked_place_id ON placex USING BTREE (linked_place_id) {{db.tablespace.address_index}} WHERE linked_place_id IS NOT NULL; -CREATE INDEX idx_placex_rank_search ON placex USING BTREE (rank_search, geometry_sector) {{db.tablespace.address_index}}; -CREATE INDEX idx_placex_geometry ON placex USING GIST (geometry) {{db.tablespace.search_index}}; +{% for osm_type in ('N', 'W', 'R') %} +CREATE INDEX idx_placex_osmid_{{osm_type | lower}} ON placex + USING BTREE (osm_id) {{db.tablespace.search_index}} + WHERE osm_type = '{{osm_type}}'; +{% endfor %} + +-- Usage: - removing linkage status on update +-- - lookup linked places for /details +CREATE INDEX idx_placex_linked_place_id ON placex + USING BTREE (linked_place_id) {{db.tablespace.address_index}} + WHERE linked_place_id IS NOT NULL; + +-- Usage: - check that admin boundaries do not overtake each other rank-wise +-- - check that place node in a admin boundary with the same address level +-- - boundary is not completely contained in a place area +-- - parenting of large-area or unparentable features +CREATE INDEX idx_placex_geometry_address_area_candidates ON placex + USING gist (geometry) {{db.tablespace.address_index}} + WHERE rank_address between 1 and 25 + and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon'); + +-- Usage: - POI is within building with housenumber CREATE INDEX idx_placex_geometry_buildings ON placex - USING {{postgres.spgist_geom}} (geometry) {{db.tablespace.search_index}} + USING {{postgres.spgist_geom}} (geometry) {{db.tablespace.address_index}} WHERE address is not null and rank_search = 30 and ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon'); + +-- Usage: - linking of similar named places to boundaries +-- - linking of place nodes with same type to boundaries CREATE INDEX idx_placex_geometry_placenode ON placex - USING {{postgres.spgist_geom}} (geometry) {{db.tablespace.search_index}} + USING {{postgres.spgist_geom}} (geometry) {{db.tablespace.address_index}} WHERE osm_type = 'N' and rank_search < 26 - and class = 'place' and type != 'postcode' and linked_place_id is null; -CREATE INDEX idx_placex_wikidata on placex USING BTREE ((extratags -> 'wikidata')) {{db.tablespace.address_index}} WHERE extratags ? 'wikidata' and class = 'place' and osm_type = 'N' and rank_search < 26; + and class = 'place' and type != 'postcode'; + +-- Usage: - is node part of a way? +-- - find parent of interpolation spatially +CREATE INDEX idx_placex_geometry_lower_rank_ways ON placex + USING {{postgres.spgist_geom}} (geometry) {{db.tablespace.address_index}} + WHERE osm_type = 'W' and rank_search >= 26; + +-- Usage: - linking place nodes by wikidata tag to boundaries +CREATE INDEX idx_placex_wikidata on placex + USING BTREE ((extratags -> 'wikidata')) {{db.tablespace.address_index}} + WHERE extratags ? 'wikidata' and class = 'place' + and osm_type = 'N' and rank_search < 26; + +-- The following two indexes function as a todo list for indexing. + +CREATE INDEX idx_placex_rank_address_sector ON placex + USING BTREE (rank_address, geometry_sector) {{db.tablespace.address_index}} + WHERE indexed_status > 0; + +CREATE INDEX idx_placex_rank_boundaries_sector ON placex + USING BTREE (rank_search, geometry_sector) {{db.tablespace.address_index}} + WHERE class = 'boundary' and type = 'administrative' + and indexed_status > 0; + DROP SEQUENCE IF EXISTS seq_place; CREATE SEQUENCE seq_place start 1; @@ -228,7 +275,7 @@ CREATE SEQUENCE file start 1; -- null table so it won't error -- deliberately no drop - importing the table is expensive and static, if it is already there better to avoid removing it -CREATE TABLE wikipedia_article ( +CREATE TABLE IF NOT EXISTS wikipedia_article ( language text NOT NULL, title text NOT NULL, langcount integer, @@ -242,18 +289,28 @@ CREATE TABLE wikipedia_article ( wd_page_title text, instance_of text ); -ALTER TABLE ONLY wikipedia_article ADD CONSTRAINT wikipedia_article_pkey PRIMARY KEY (language, title); -CREATE INDEX idx_wikipedia_article_osm_id ON wikipedia_article USING btree (osm_type, osm_id); -CREATE TABLE wikipedia_redirect ( +CREATE TABLE IF NOT EXISTS wikipedia_redirect ( language text, from_title text, to_title text ); -ALTER TABLE ONLY wikipedia_redirect ADD CONSTRAINT wikipedia_redirect_pkey PRIMARY KEY (language, from_title); -- osm2pgsql does not create indexes on the middle tables for Nominatim -- Add one for lookup of associated street relations. -CREATE INDEX planet_osm_rels_parts_associated_idx ON planet_osm_rels USING gin(parts) WHERE tags @> ARRAY['associatedStreet']; +{% if db.middle_db_format == '1' %} +CREATE INDEX planet_osm_rels_parts_associated_idx ON planet_osm_rels USING gin(parts) + {{db.tablespace.address_index}} + WHERE tags @> ARRAY['associatedStreet']; +{% else %} +CREATE INDEX planet_osm_rels_relation_members_idx ON planet_osm_rels USING gin(planet_osm_member_ids(members, 'R'::character(1))) + WITH (fastupdate=off) + {{db.tablespace.address_index}}; +{% endif %} + +-- Needed for lookups if a node is part of an interpolation. +CREATE INDEX IF NOT EXISTS idx_place_interpolations + ON place USING gist(geometry) {{db.tablespace.address_index}} + WHERE osm_type = 'W' and address ? 'interpolation'; GRANT SELECT ON table country_osm_grid to "{{config.DATABASE_WEBUSER}}";