mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
get address terms from address tags for rank 30
For rank 30 objects add extra elements into the place_addressline table.
This commit is contained in:
@@ -414,10 +414,14 @@ $$
|
|||||||
LANGUAGE plpgsql;
|
LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION create_poi_search_terms(parent_place_id BIGINT,
|
CREATE OR REPLACE FUNCTION create_poi_search_terms(obj_place_id BIGINT,
|
||||||
|
in_partition SMALLINT,
|
||||||
|
parent_place_id BIGINT,
|
||||||
address HSTORE,
|
address HSTORE,
|
||||||
|
country TEXT,
|
||||||
housenumber TEXT,
|
housenumber TEXT,
|
||||||
initial_name_vector INTEGER[],
|
initial_name_vector INTEGER[],
|
||||||
|
geometry GEOMETRY,
|
||||||
OUT name_vector INTEGER[],
|
OUT name_vector INTEGER[],
|
||||||
OUT nameaddress_vector INTEGER[])
|
OUT nameaddress_vector INTEGER[])
|
||||||
AS $$
|
AS $$
|
||||||
@@ -427,34 +431,52 @@ DECLARE
|
|||||||
addr_place_ids INTEGER[];
|
addr_place_ids INTEGER[];
|
||||||
|
|
||||||
addr_item RECORD;
|
addr_item RECORD;
|
||||||
|
parent_address_place_ids BIGINT[];
|
||||||
BEGIN
|
BEGIN
|
||||||
-- Compute all search terms from the addr: tags.
|
|
||||||
nameaddress_vector := '{}'::INTEGER[];
|
nameaddress_vector := '{}'::INTEGER[];
|
||||||
|
|
||||||
|
SELECT s.name_vector, s.nameaddress_vector
|
||||||
|
INTO parent_name_vector, parent_address_vector
|
||||||
|
FROM search_name s
|
||||||
|
WHERE s.place_id = parent_place_id;
|
||||||
|
|
||||||
|
-- Compute all search terms from the addr: tags.
|
||||||
IF address IS NOT NULL THEN
|
IF address IS NOT NULL THEN
|
||||||
FOR addr_item IN SELECT * FROM each(address)
|
FOR addr_item IN
|
||||||
|
SELECT * FROM
|
||||||
|
get_places_for_addr_tags(in_partition, geometry, address, country)
|
||||||
LOOP
|
LOOP
|
||||||
IF addr_item.key IN ('city', 'tiger:county', 'state', 'suburb', 'province',
|
IF addr_item.place_id is null THEN
|
||||||
'district', 'region', 'county', 'municipality',
|
nameaddress_vector := array_merge(nameaddress_vector,
|
||||||
'hamlet', 'village', 'subdistrict', 'town',
|
addr_item.keywords);
|
||||||
'neighbourhood', 'quarter', 'parish')
|
CONTINUE;
|
||||||
THEN
|
END IF;
|
||||||
nameaddress_vector := array_merge(nameaddress_vector,
|
|
||||||
addr_ids_from_name(addr_item.value));
|
IF parent_address_place_ids is null THEN
|
||||||
END IF;
|
SELECT array_agg(parent_place_id) INTO parent_address_place_ids
|
||||||
|
FROM place_addressline
|
||||||
|
WHERE place_id = parent_place_id;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF not parent_address_place_ids @> ARRAY[addr_item.place_id] THEN
|
||||||
|
nameaddress_vector := array_merge(nameaddress_vector,
|
||||||
|
addr_item.keywords);
|
||||||
|
|
||||||
|
INSERT INTO place_addressline (place_id, address_place_id, fromarea,
|
||||||
|
isaddress, distance, cached_rank_address)
|
||||||
|
VALUES (obj_place_id, addr_item.place_id, not addr_item.isguess,
|
||||||
|
true, addr_item.distance, addr_item.rank_address);
|
||||||
|
END IF;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
|
||||||
-- If the POI is named, simply mix in all address terms and be done.
|
-- If the POI is named, simply mix in all address terms and be done.
|
||||||
IF array_length(initial_name_vector, 1) is not NULL THEN
|
IF array_length(initial_name_vector, 1) is not NULL THEN
|
||||||
-- Cheating here by not recomputing all terms but simply using the ones
|
-- Cheating here by not recomputing all terms but simply using the ones
|
||||||
-- from the parent object.
|
-- from the parent object.
|
||||||
SELECT array_merge(s.name_vector, s.nameaddress_vector)
|
|
||||||
INTO parent_address_vector
|
|
||||||
FROM search_name s
|
|
||||||
WHERE s.place_id = parent_place_id;
|
|
||||||
|
|
||||||
name_vector := initial_name_vector;
|
name_vector := initial_name_vector;
|
||||||
|
nameaddress_vector := array_merge(nameaddress_vector, parent_name_vector);
|
||||||
nameaddress_vector := array_merge(nameaddress_vector, parent_address_vector);
|
nameaddress_vector := array_merge(nameaddress_vector, parent_address_vector);
|
||||||
|
|
||||||
IF not address ? 'street' and address ? 'place' THEN
|
IF not address ? 'street' and address ? 'place' THEN
|
||||||
@@ -475,11 +497,6 @@ BEGIN
|
|||||||
RETURN;
|
RETURN;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
SELECT s.name_vector, s.nameaddress_vector
|
|
||||||
INTO parent_name_vector, parent_address_vector
|
|
||||||
FROM search_name s
|
|
||||||
WHERE s.place_id = parent_place_id;
|
|
||||||
|
|
||||||
-- Check if the parent covers all address terms.
|
-- Check if the parent covers all address terms.
|
||||||
-- If not, create a search name entry with the house number as the name.
|
-- If not, create a search name entry with the house number as the name.
|
||||||
-- This is unusual for the search_name table but prevents that the place
|
-- This is unusual for the search_name table but prevents that the place
|
||||||
|
|||||||
@@ -813,13 +813,17 @@ BEGIN
|
|||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF NOT %REVERSE-ONLY% THEN
|
IF array_length(name_vector, 1) is not NULL
|
||||||
|
OR inherited_address is not NULL OR NEW.address is not NULL
|
||||||
|
THEN
|
||||||
SELECT * INTO name_vector, nameaddress_vector
|
SELECT * INTO name_vector, nameaddress_vector
|
||||||
FROM create_poi_search_terms(NEW.parent_place_id,
|
FROM create_poi_search_terms(NEW.place_id,
|
||||||
|
NEW.partition, NEW.parent_place_id,
|
||||||
inherited_address || NEW.address,
|
inherited_address || NEW.address,
|
||||||
NEW.housenumber, name_vector);
|
NEW.country_code, NEW.housenumber,
|
||||||
|
name_vector, NEW.centroid);
|
||||||
|
|
||||||
IF array_length(name_vector, 1) is not NULL THEN
|
IF not %REVERSE-ONLY% AND 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, search_rank, address_rank,
|
||||||
importance, country_code, name_vector,
|
importance, country_code, name_vector,
|
||||||
nameaddress_vector, centroid)
|
nameaddress_vector, centroid)
|
||||||
|
|||||||
@@ -72,8 +72,6 @@ BEGIN
|
|||||||
FOR item IN
|
FOR item IN
|
||||||
SELECT (get_addr_tag_rank(key, country)).*, key, name FROM
|
SELECT (get_addr_tag_rank(key, country)).*, key, name FROM
|
||||||
(SELECT skeys(address) as key, svals(address) as name) x
|
(SELECT skeys(address) as key, svals(address) as name) x
|
||||||
WHERE key not in ('country', 'postcode', 'housenumber',
|
|
||||||
'conscriptionnumber', 'streetnumber')
|
|
||||||
LOOP
|
LOOP
|
||||||
IF item.from_rank is null THEN
|
IF item.from_rank is null THEN
|
||||||
CONTINUE;
|
CONTINUE;
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ Feature: Address computation
|
|||||||
| object | address |
|
| object | address |
|
||||||
| W1 | W2 |
|
| W1 | W2 |
|
||||||
|
|
||||||
Scenario: addr:* tags are honored even when the place is outside
|
Scenario: addr:* tags are honored even when a street is far away from the place
|
||||||
Given the grid
|
Given the grid
|
||||||
| 1 | | 2 | | | 5 |
|
| 1 | | 2 | | | 5 |
|
||||||
| | | | 8 | 9 | |
|
| | | | 8 | 9 | |
|
||||||
@@ -321,3 +321,26 @@ Feature: Address computation
|
|||||||
| object | address |
|
| object | address |
|
||||||
| W2 | R1 |
|
| W2 | R1 |
|
||||||
|
|
||||||
|
|
||||||
|
Scenario: addr:* tags are honored even when a POI is far away from the place
|
||||||
|
Given the grid
|
||||||
|
| 1 | | 2 | | | 5 |
|
||||||
|
| | | | 8 | 9 | |
|
||||||
|
| 4 | | 3 | | | 6 |
|
||||||
|
And the places
|
||||||
|
| osm | class | type | admin | name | geometry |
|
||||||
|
| R1 | boundary | administrative | 8 | Left | (1,2,3,4,1) |
|
||||||
|
| R2 | boundary | administrative | 8 | Right | (2,3,6,5,2) |
|
||||||
|
And the named places
|
||||||
|
| osm | class | type | addr+city | geometry |
|
||||||
|
| W1 | highway | primary | Right | 8,9 |
|
||||||
|
| N1 | amenity | cafe | Left | 9 |
|
||||||
|
When importing
|
||||||
|
Then place_addressline contains
|
||||||
|
| object | address | isaddress |
|
||||||
|
| W1 | R2 | True |
|
||||||
|
| N1 | R1 | True |
|
||||||
|
And place_addressline doesn't contain
|
||||||
|
| object | address |
|
||||||
|
| W1 | R1 |
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user