]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge pull request #2058 from lonvia/split-address-words
authorSarah Hoffmann <lonvia@denofr.de>
Wed, 18 Nov 2020 07:58:17 +0000 (08:58 +0100)
committerGitHub <noreply@github.com>
Wed, 18 Nov 2020 07:58:17 +0000 (08:58 +0100)
Split addr:* tags into words before adding to the search index

1  2 
sql/functions/normalization.sql
test/bdd/db/import/search_name.feature

index 03b97968e73b2d3bd752aa4a904781a4e2ddb05b,a5560cb98dbb719de4bfe54397e9889442374d57..4aea0e9ba3673854dd4cf8ed7dea492916600b66
@@@ -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;
index fe339f13e8141814f9721930c691c62c0e089877,beae3444ee7fe4f75a7a338673c177243d359b45..30c430a6b4503e33da91aa4d53a04eb8e9db4d25
@@@ -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 |
           | 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 |
          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