X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/85d65a2fd27cc5bc47685e7759a1895e1f9f2236..4efad0bb95024e2082f73b4ae33613ef8f6ebef3:/lib-sql/tables.sql diff --git a/lib-sql/tables.sql b/lib-sql/tables.sql index 538286b8..d576485e 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}}"; @@ -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,66 @@ 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 +-- - lookupPolygon() 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 +276,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,15 +290,12 @@ 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.