From 345637290b85dc24f5023f07d919ff5d8dc486e9 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Tue, 23 Nov 2021 20:04:50 +0100 Subject: [PATCH 1/3] take Tiger housenumbers into account when ranking street results Queries with a housenumber need to rank streets higher that have the requested housenumber attached. We already do that for ordinary housenumber objects and for interpolations. This adds support for Tiger housenumbers as well. Fixes #2501. --- lib-php/SearchDescription.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib-php/SearchDescription.php b/lib-php/SearchDescription.php index 4962d9ff..be5623af 100644 --- a/lib-php/SearchDescription.php +++ b/lib-php/SearchDescription.php @@ -591,8 +591,7 @@ class SearchDescription $sChildHnr .= ' AND housenumber ~* E'.$sHouseNumberRegex; // Interpolations on streets and places. if (preg_match('/^[0-9]+$/', $this->sHouseNumber)) { - $sIpolHnr = 'SELECT * FROM location_property_osmline '; - $sIpolHnr .= 'WHERE parent_place_id = search_name.place_id '; + $sIpolHnr = 'WHERE parent_place_id = search_name.place_id '; $sIpolHnr .= ' AND startnumber is not NULL'; $sIpolHnr .= ' AND '.$this->sHouseNumber.'>=startnumber '; $sIpolHnr .= ' AND '.$this->sHouseNumber.'<=endnumber '; @@ -606,7 +605,11 @@ class SearchDescription $sSql = '(CASE WHEN address_rank = 30 THEN EXISTS('.$sSelfHnr.') '; $sSql .= ' ELSE EXISTS('.$sChildHnr.') '; if ($sIpolHnr) { - $sSql .= 'OR EXISTS('.$sIpolHnr.') '; + $sSql .= 'OR EXISTS(SELECT * FROM location_property_osmline '.$sIpolHnr.') '; + if (CONST_Use_US_Tiger_Data) { + $sSql .= "OR (country_code = 'us' AND "; + $sSql .= ' EXISTS(SELECT * FROM location_property_tiger '.$sIpolHnr.')) '; + } } $sSql .= 'END) DESC'; From b1d490ea53c2fddb3fe2c5466267e898e87e743e Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Tue, 23 Nov 2021 20:24:08 +0100 Subject: [PATCH 2/3] add index for Tiger housenumber queries --- lib-sql/tiger_import_finish.sql | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib-sql/tiger_import_finish.sql b/lib-sql/tiger_import_finish.sql index 1a9dc2dd..fb76477c 100644 --- a/lib-sql/tiger_import_finish.sql +++ b/lib-sql/tiger_import_finish.sql @@ -1,6 +1,10 @@ --index only on parent_place_id CREATE INDEX IF NOT EXISTS idx_location_property_tiger_parent_place_id_imp - ON location_property_tiger_import (parent_place_id) {{db.tablespace.aux_index}}; + ON location_property_tiger_import (parent_place_id) +{% if postgres.has_index_non_key_column %} + INCLUDE (startnumber, endnumber) +{% endif %} + {{db.tablespace.aux_index}}; CREATE UNIQUE INDEX IF NOT EXISTS idx_location_property_tiger_place_id_imp ON location_property_tiger_import (place_id) {{db.tablespace.aux_index}}; From 810056349f0dde9e0ddeb6655cbf1aa48399b3a5 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Wed, 24 Nov 2021 11:05:04 +0100 Subject: [PATCH 3/3] add migration for inclusive housenumber Tiger index --- nominatim/tools/migration.py | 17 +++++++++++++++++ nominatim/version.py | 10 +++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/nominatim/tools/migration.py b/nominatim/tools/migration.py index d7faca31..87febacc 100644 --- a/nominatim/tools/migration.py +++ b/nominatim/tools/migration.py @@ -192,3 +192,20 @@ def install_legacy_tokenizer(conn, config, **_): module_name='legacy') tokenizer.migrate_database(config) + + +@_migration(4, 0, 99, 0) +def create_tiger_housenumber_index(conn, _, **_): + """ Create idx_location_property_tiger_parent_place_id with included + house number. + + The inclusion is needed for efficient lookup of housenumbers in + full address searches. + """ + if conn.server_version_tuple() >= (11, 0, 0): + with conn.cursor() as cur: + cur.execute(""" CREATE INDEX IF NOT EXISTS + idx_location_property_tiger_housenumber_migrated + ON location_property_tiger + USING btree(parent_place_id) + INCLUDE (startnumber, endnumber) """) diff --git a/nominatim/version.py b/nominatim/version.py index dcfc161e..06a3e971 100644 --- a/nominatim/version.py +++ b/nominatim/version.py @@ -9,8 +9,16 @@ Version information for Nominatim. # The database patch level tracks important changes between releases # and must always be increased when there is a change to the database or code # that requires a migration. +# +# When adding a migration on the development branch, raise the patch level +# to 99 to make sure that the migration is applied when updating from a +# patch release to the next minor version. Patch releases usually shouldn't +# have migrations in them. When they are needed, then make sure that the +# migration can reapplied and set the migration version to the appropriate +# patch level when cherry-picking the commit with the migration. +# # Released versions always have a database patch level of 0. -NOMINATIM_VERSION = (4, 0, 0, 0) +NOMINATIM_VERSION = (4, 0, 99, 1) POSTGRESQL_REQUIRED_VERSION = (9, 5) POSTGIS_REQUIRED_VERSION = (2, 2)