From: Sarah Hoffmann Date: Wed, 18 Nov 2020 07:58:17 +0000 (+0100) Subject: Merge pull request #2058 from lonvia/split-address-words X-Git-Tag: v3.6.0~29 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/49083c2597f7abcf8e6b73de9662029c22807481?hp=-c Merge pull request #2058 from lonvia/split-address-words Split addr:* tags into words before adding to the search index --- 49083c2597f7abcf8e6b73de9662029c22807481 diff --combined sql/functions/normalization.sql index 03b97968,a5560cb9..4aea0e9b --- a/sql/functions/normalization.sql +++ b/sql/functions/normalization.sql @@@ -207,19 -207,31 +207,31 @@@ CREATE OR REPLACE FUNCTION addr_ids_fro RETURNS INTEGER[] AS $$ DECLARE - lookup_token TEXT; + words TEXT[]; id INTEGER; return_word_id INTEGER[]; + word_ids INTEGER[]; + j INTEGER; BEGIN - lookup_token := make_standard_name(lookup_word); - SELECT array_agg(word_id) FROM word - WHERE word_token = lookup_token and class is null and type is null - INTO return_word_id; - IF return_word_id IS NULL THEN - id := nextval('seq_word'); - INSERT INTO word VALUES (id, lookup_token, null, null, null, null, 0); - return_word_id = ARRAY[id]; + words := string_to_array(make_standard_name(lookup_word), ' '); + IF array_upper(words, 1) IS NOT NULL THEN + FOR j IN 1..array_upper(words, 1) LOOP + IF (words[j] != '') THEN + SELECT array_agg(word_id) INTO word_ids + FROM word + WHERE word_token = words[j] and class is null and type is null; + + IF word_ids IS NULL THEN + id := nextval('seq_word'); + INSERT INTO word VALUES (id, words[j], null, null, null, null, 0); + return_word_id := return_word_id || id; + ELSE + return_word_id := array_merge(return_word_id, word_ids); + END IF; + END IF; + END LOOP; END IF; + RETURN return_word_id; END; $$ @@@ -518,14 -530,16 +530,14 @@@ BEGI addr_place_ids := addr_ids_from_name(address->'place'); IF not addr_place_ids <@ parent_name_vector THEN -- addr:place tag exists without a corresponding place. Mix in addr:place - -- in the address and drop the name from the parent. This would only be - -- the street name of the nearest street. - nameaddress_vector := array_merge(nameaddress_vector, addr_place_ids); + -- in the address. name_vector := ARRAY[getorcreate_name_id(housenumber)]; + nameaddress_vector := array_merge(nameaddress_vector, addr_place_ids); END IF; - ELSE - nameaddress_vector := array_merge(nameaddress_vector, parent_name_vector); END IF; - -- The address vector always gets merged in. + -- Merge the parent name and address. + nameaddress_vector := array_merge(nameaddress_vector, parent_name_vector); nameaddress_vector := array_merge(nameaddress_vector, parent_address_vector); END; diff --combined test/bdd/db/import/search_name.feature index fe339f13,beae3444..30c430a6 --- a/test/bdd/db/import/search_name.feature +++ b/test/bdd/db/import/search_name.feature @@@ -30,7 -30,24 +30,24 @@@ Feature: Creation of search term | osm_type | osm_id | name | | N | 1 | 23, Rose Street | - Scenario: Unnamed POI has no search entry when it has known addr: tags + Scenario: Searching for unknown addr: tags also works for multiple words + Given the scene roads-with-pois + And the places + | osm | class | type | housenr | addr+city | geometry | + | N1 | place | house | 23 | Little Big Town | :p-N1 | + And the places + | osm | class | type | name+name | geometry | + | W1 | highway | residential | Rose Street | :w-north | + When importing + Then search_name contains + | object | name_vector | nameaddress_vector | + | N1 | #23 | Rose Street, Little, Big, Town | + When searching for "23 Rose Street, Little Big Town" + Then results contain + | osm_type | osm_id | name | + | N | 1 | 23, Rose Street | + + Scenario: Unnamed POI has no search entry when it has known addr: tags Given the scene roads-with-pois And the places | osm | class | type | housenr | addr+city | geometry | @@@ -56,7 -73,7 +73,7 @@@ When importing Then search_name has no entry for N1 - Scenario: Unnamed POIs doesn't inherit parent name when unknown addr:place is present + Scenario: Unnamed POIs inherit parent name when unknown addr:place is present Given the scene roads-with-pois And the places | osm | class | type | housenr | addr+place | geometry | @@@ -66,18 -83,15 +83,18 @@@ | W1 | highway | residential | Rose Street | :w-north | | N2 | place | city | Strange Town | :p-N1 | When importing + Then placex contains + | object | parent_place_id | + | N1 | N2 | Then search_name contains | object | name_vector | nameaddress_vector | - | N1 | #23 | Walltown | + | N1 | #23 | Walltown, Strange, Town | When searching for "23 Rose Street" Then exactly 1 results are returned And results contain | osm_type | osm_id | name | | W | 1 | Rose Street, Strange Town | - When searching for "23 Walltown" + When searching for "23 Walltown, Strange Town" Then results contain | osm_type | osm_id | name | | N | 1 | 23, Walltown, Strange Town | @@@ -200,7 -214,7 +217,7 @@@ When importing Then search_name contains | object | nameaddress_vector | - | W1 | bonn, new york, smalltown | + | W1 | bonn, new, york, smalltown | Scenario: A known addr:* tag is added even if the name is unknown Given the scene roads-with-pois