split addr: tags into words before adding to the search index

Address parts are only matched by single partial words. If
the addr: names are not split, then multi-word names cannot
be found.
This commit is contained in:
Sarah Hoffmann
2020-11-17 18:03:33 +01:00
parent cc345f531a
commit 30a6b6bdac
2 changed files with 40 additions and 11 deletions

View File

@@ -207,19 +207,31 @@ CREATE OR REPLACE FUNCTION addr_ids_from_name(lookup_word TEXT)
RETURNS INTEGER[] RETURNS INTEGER[]
AS $$ AS $$
DECLARE DECLARE
lookup_token TEXT; words TEXT[];
id INTEGER; id INTEGER;
return_word_id INTEGER[]; return_word_id INTEGER[];
word_ids INTEGER[];
j INTEGER;
BEGIN BEGIN
lookup_token := make_standard_name(lookup_word); words := string_to_array(make_standard_name(lookup_word), ' ');
SELECT array_agg(word_id) FROM word IF array_upper(words, 1) IS NOT NULL THEN
WHERE word_token = lookup_token and class is null and type is null FOR j IN 1..array_upper(words, 1) LOOP
INTO return_word_id; IF (words[j] != '') THEN
IF return_word_id IS NULL THEN SELECT array_agg(word_id) INTO word_ids
id := nextval('seq_word'); FROM word
INSERT INTO word VALUES (id, lookup_token, null, null, null, null, 0); WHERE word_token = words[j] and class is null and type is null;
return_word_id = ARRAY[id];
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; END IF;
RETURN return_word_id; RETURN return_word_id;
END; END;
$$ $$

View File

@@ -30,7 +30,24 @@ Feature: Creation of search terms
| osm_type | osm_id | name | | osm_type | osm_id | name |
| N | 1 | 23, Rose Street | | 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 Given the scene roads-with-pois
And the places And the places
| osm | class | type | housenr | addr+city | geometry | | osm | class | type | housenr | addr+city | geometry |
@@ -197,7 +214,7 @@ Feature: Creation of search terms
When importing When importing
Then search_name contains Then search_name contains
| object | nameaddress_vector | | 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 Scenario: A known addr:* tag is added even if the name is unknown
Given the scene roads-with-pois Given the scene roads-with-pois