From 7bbfb4b97240774aae20a0ead149528f7701ab25 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Mon, 2 Mar 2026 11:32:06 +0100 Subject: [PATCH] drop search_rank column from search_name This is no longer needed for the initial lookup. --- lib-sql/functions/placex_triggers.sql | 8 +++--- lib-sql/tables/search_name.sql | 1 - .../search/db_searches/address_search.py | 4 +-- .../search/db_searches/place_search.py | 26 ++++++++++++------- src/nominatim_api/sql/sqlalchemy_schema.py | 3 +-- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/lib-sql/functions/placex_triggers.sql b/lib-sql/functions/placex_triggers.sql index 4e27058c..99341446 100644 --- a/lib-sql/functions/placex_triggers.sql +++ b/lib-sql/functions/placex_triggers.sql @@ -1138,10 +1138,10 @@ BEGIN NEW.token_info, NEW.centroid); IF array_length(name_vector, 1) is not NULL THEN - INSERT INTO search_name (place_id, search_rank, address_rank, + INSERT INTO search_name (place_id, address_rank, importance, country_code, name_vector, nameaddress_vector, centroid) - VALUES (NEW.place_id, NEW.rank_search, NEW.rank_address, + VALUES (NEW.place_id, NEW.rank_address, NEW.importance, NEW.country_code, name_vector, nameaddress_vector, NEW.centroid); {% if debug %}RAISE WARNING 'Place added to search table';{% endif %} @@ -1311,10 +1311,10 @@ BEGIN {% if debug %}RAISE WARNING 'added to search name (full)';{% endif %} {% if not db.reverse_only %} - INSERT INTO search_name (place_id, search_rank, address_rank, + INSERT INTO search_name (place_id, address_rank, importance, country_code, name_vector, nameaddress_vector, centroid) - VALUES (NEW.place_id, NEW.rank_search, NEW.rank_address, + VALUES (NEW.place_id, NEW.rank_address, NEW.importance, NEW.country_code, name_vector, nameaddress_vector, NEW.centroid); {% endif %} diff --git a/lib-sql/tables/search_name.sql b/lib-sql/tables/search_name.sql index 5ea3d5f8..ac611345 100644 --- a/lib-sql/tables/search_name.sql +++ b/lib-sql/tables/search_name.sql @@ -12,7 +12,6 @@ DROP TABLE IF EXISTS search_name; CREATE TABLE search_name ( place_id BIGINT NOT NULL, importance FLOAT NOT NULL, - search_rank SMALLINT NOT NULL, address_rank SMALLINT NOT NULL, name_vector integer[] NOT NULL, nameaddress_vector integer[] NOT NULL, diff --git a/src/nominatim_api/search/db_searches/address_search.py b/src/nominatim_api/search/db_searches/address_search.py index 2b4786ec..5d1fe5ce 100644 --- a/src/nominatim_api/search/db_searches/address_search.py +++ b/src/nominatim_api/search/db_searches/address_search.py @@ -155,7 +155,7 @@ class AddressSearch(base.AbstractSearch): for ranking in self.rankings: penalty += ranking.sql_penalty(t) - sql = sa.select(t.c.place_id, t.c.search_rank, t.c.address_rank, + sql = sa.select(t.c.place_id, t.c.address_rank, t.c.country_code, t.c.centroid, t.c.name_vector, t.c.nameaddress_vector, t.c.importance, penalty.label('penalty')) @@ -199,7 +199,7 @@ class AddressSearch(base.AbstractSearch): inner = sql.limit(10000).order_by(sa.desc(sa.text('importance'))).subquery() - sql = sa.select(inner.c.place_id, inner.c.search_rank, inner.c.address_rank, + sql = sa.select(inner.c.place_id, inner.c.address_rank, inner.c.country_code, inner.c.centroid, inner.c.importance, inner.c.penalty) diff --git a/src/nominatim_api/search/db_searches/place_search.py b/src/nominatim_api/search/db_searches/place_search.py index e8119a69..89f5a962 100644 --- a/src/nominatim_api/search/db_searches/place_search.py +++ b/src/nominatim_api/search/db_searches/place_search.py @@ -58,7 +58,7 @@ class PlaceSearch(base.AbstractSearch): for ranking in self.rankings: penalty += ranking.sql_penalty(t) - sql = sa.select(t.c.place_id, t.c.search_rank, t.c.address_rank, + sql = sa.select(t.c.place_id, t.c.address_rank, t.c.country_code, t.c.centroid, t.c.name_vector, t.c.nameaddress_vector, t.c.importance) @@ -101,12 +101,13 @@ class PlaceSearch(base.AbstractSearch): if details.excluded: sql = sql.where(base.exclude_places(t)) - if details.min_rank > 0: - sql = sql.where(sa.or_(t.c.address_rank >= MIN_RANK_PARAM, - t.c.search_rank >= MIN_RANK_PARAM)) - if details.max_rank < 30: - sql = sql.where(sa.or_(t.c.address_rank <= MAX_RANK_PARAM, - t.c.search_rank <= MAX_RANK_PARAM)) + # Do not restrict ranks too much yet because rank restriction + # currently also depends on search_rank to account for state-cities + # like Berlin. + if details.max_rank < 26: + sql = sql.where(t.c.address_rank < 26) + elif details.max_rank < 30: + sql = sql.where(t.c.address_rank < MAX_RANK_PARAM) sql = sql.add_columns(penalty.label('penalty')) @@ -114,7 +115,7 @@ class PlaceSearch(base.AbstractSearch): .order_by(sa.desc(sa.text('importance')))\ .subquery() - sql = sa.select(inner.c.place_id, inner.c.search_rank, inner.c.address_rank, + sql = sa.select(inner.c.place_id, inner.c.address_rank, inner.c.country_code, inner.c.centroid, inner.c.importance, inner.c.penalty) @@ -130,7 +131,7 @@ class PlaceSearch(base.AbstractSearch): inner = sql.subquery() - sql = sa.select(inner.c.place_id, inner.c.search_rank, inner.c.address_rank, + sql = sa.select(inner.c.place_id, inner.c.address_rank, inner.c.country_code, inner.c.centroid, inner.c.importance, inner.c.penalty)\ .where(inner.c.penalty - inner.c.importance < inner.c.min_penalty + 0.5) @@ -174,6 +175,13 @@ class PlaceSearch(base.AbstractSearch): sql = sql.order_by(penalty - tsearch.c.importance) sql = sql.add_columns(tsearch.c.importance) + if details.min_rank > 0: + sql = sql.where(sa.or_(t.c.rank_address >= MIN_RANK_PARAM, + t.c.rank_search >= MIN_RANK_PARAM)) + if details.max_rank < 30: + sql = sql.where(sa.or_(t.c.rank_address <= MAX_RANK_PARAM, + t.c.rank_search <= MAX_RANK_PARAM)) + sql = sql.add_columns(penalty.label('accuracy'))\ .order_by(sa.text('accuracy')) diff --git a/src/nominatim_api/sql/sqlalchemy_schema.py b/src/nominatim_api/sql/sqlalchemy_schema.py index f9e4c595..e140ee0a 100644 --- a/src/nominatim_api/sql/sqlalchemy_schema.py +++ b/src/nominatim_api/sql/sqlalchemy_schema.py @@ -2,7 +2,7 @@ # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2025 by the Nominatim developer community. +# Copyright (C) 2026 by the Nominatim developer community. # For a full list of authors see the git log. """ SQLAlchemy definitions for all tables used by the frontend. @@ -112,7 +112,6 @@ class SearchTables: 'search_name', meta, sa.Column('place_id', sa.BigInteger), sa.Column('importance', sa.Float), - sa.Column('search_rank', sa.SmallInteger), sa.Column('address_rank', sa.SmallInteger), sa.Column('name_vector', IntArray), sa.Column('nameaddress_vector', IntArray),