mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-12-24 13:31:37 +03: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:
parent
6260fef2e8
commit
021f2bef4c
@ -414,10 +414,14 @@ $$
|
||||
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,
|
||||
country TEXT,
|
||||
housenumber TEXT,
|
||||
initial_name_vector INTEGER[],
|
||||
geometry GEOMETRY,
|
||||
OUT name_vector INTEGER[],
|
||||
OUT nameaddress_vector INTEGER[])
|
||||
AS $$
|
||||
@ -427,34 +431,52 @@ DECLARE
|
||||
addr_place_ids INTEGER[];
|
||||
|
||||
addr_item RECORD;
|
||||
parent_address_place_ids BIGINT[];
|
||||
BEGIN
|
||||
-- Compute all search terms from the addr: tags.
|
||||
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
|
||||
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
|
||||
IF addr_item.key IN ('city', 'tiger:county', 'state', 'suburb', 'province',
|
||||
'district', 'region', 'county', 'municipality',
|
||||
'hamlet', 'village', 'subdistrict', 'town',
|
||||
'neighbourhood', 'quarter', 'parish')
|
||||
THEN
|
||||
nameaddress_vector := array_merge(nameaddress_vector,
|
||||
addr_ids_from_name(addr_item.value));
|
||||
END IF;
|
||||
IF addr_item.place_id is null THEN
|
||||
nameaddress_vector := array_merge(nameaddress_vector,
|
||||
addr_item.keywords);
|
||||
CONTINUE;
|
||||
END IF;
|
||||
|
||||
IF parent_address_place_ids is null THEN
|
||||
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 IF;
|
||||
|
||||
|
||||
-- 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
|
||||
-- Cheating here by not recomputing all terms but simply using the ones
|
||||
-- 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;
|
||||
nameaddress_vector := array_merge(nameaddress_vector, parent_name_vector);
|
||||
nameaddress_vector := array_merge(nameaddress_vector, parent_address_vector);
|
||||
|
||||
IF not address ? 'street' and address ? 'place' THEN
|
||||
@ -475,11 +497,6 @@ BEGIN
|
||||
RETURN;
|
||||
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.
|
||||
-- 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
|
||||
|
@ -813,13 +813,17 @@ BEGIN
|
||||
|
||||
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
|
||||
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,
|
||||
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,
|
||||
importance, country_code, name_vector,
|
||||
nameaddress_vector, centroid)
|
||||
|
@ -72,8 +72,6 @@ BEGIN
|
||||
FOR item IN
|
||||
SELECT (get_addr_tag_rank(key, country)).*, key, name FROM
|
||||
(SELECT skeys(address) as key, svals(address) as name) x
|
||||
WHERE key not in ('country', 'postcode', 'housenumber',
|
||||
'conscriptionnumber', 'streetnumber')
|
||||
LOOP
|
||||
IF item.from_rank is null THEN
|
||||
CONTINUE;
|
||||
|
@ -298,7 +298,7 @@ Feature: Address computation
|
||||
| object | address |
|
||||
| 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
|
||||
| 1 | | 2 | | | 5 |
|
||||
| | | | 8 | 9 | |
|
||||
@ -321,3 +321,26 @@ Feature: Address computation
|
||||
| object | address |
|
||||
| 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 |
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user