mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-16 15:47:58 +00:00
simplify name matching between boundary and place node
Instead of normalising the names simply compare them in lower case. This removes the dependency on the tokenizer for linking boundaries and nodes. When looking up the linked places by place type also allow that one name is simply contained in the other. This catches the frequent case where one of the names has an addendum (e.g. Newport vs. City of Newport). Drops the special index for the name lookup and insted relies on a slightly extended version of the geometry index used for reverse lookup. Saves around 100MB on a planet.
This commit is contained in:
@@ -169,7 +169,7 @@ BEGIN
|
||||
END IF;
|
||||
|
||||
IF bnd.name ? 'name' THEN
|
||||
bnd_name := make_standard_name(bnd.name->'name');
|
||||
bnd_name := lower(bnd.name->'name');
|
||||
IF bnd_name = '' THEN
|
||||
bnd_name := NULL;
|
||||
END IF;
|
||||
@@ -180,12 +180,14 @@ BEGIN
|
||||
IF bnd.extratags ? 'place' and bnd_name is not null THEN
|
||||
FOR linked_placex IN
|
||||
SELECT * FROM placex
|
||||
WHERE make_standard_name(name->'name') = bnd_name
|
||||
WHERE (position(lower(name->'name') in bnd_name) > 0
|
||||
OR position(bnd_name in lower(name->'name')) > 0)
|
||||
AND placex.class = 'place' AND placex.type = bnd.extratags->'place'
|
||||
AND placex.osm_type = 'N'
|
||||
AND placex.linked_place_id is null
|
||||
AND placex.rank_search < 26 -- needed to select the right index
|
||||
AND _st_covers(bnd.geometry, placex.geometry)
|
||||
AND placex.type != 'postcode'
|
||||
AND ST_Covers(bnd.geometry, placex.geometry)
|
||||
LOOP
|
||||
{% if debug %}RAISE WARNING 'Found type-matching place node %', linked_placex.osm_id;{% endif %}
|
||||
RETURN linked_placex;
|
||||
@@ -201,7 +203,7 @@ BEGIN
|
||||
AND placex.linked_place_id is null
|
||||
AND placex.rank_search < 26
|
||||
AND _st_covers(bnd.geometry, placex.geometry)
|
||||
ORDER BY make_standard_name(name->'name') = bnd_name desc
|
||||
ORDER BY lower(name->'name') = bnd_name desc
|
||||
LOOP
|
||||
{% if debug %}RAISE WARNING 'Found wikidata-matching place node %', linked_placex.osm_id;{% endif %}
|
||||
RETURN linked_placex;
|
||||
@@ -213,7 +215,7 @@ BEGIN
|
||||
{% if debug %}RAISE WARNING 'Looking for nodes with matching names';{% endif %}
|
||||
FOR linked_placex IN
|
||||
SELECT placex.* from placex
|
||||
WHERE make_standard_name(name->'name') = bnd_name
|
||||
WHERE lower(name->'name') = bnd_name
|
||||
AND ((bnd.rank_address > 0
|
||||
and bnd.rank_address = (compute_place_rank(placex.country_code,
|
||||
'N', placex.class,
|
||||
@@ -221,9 +223,11 @@ BEGIN
|
||||
false, placex.postcode)).address_rank)
|
||||
OR (bnd.rank_address = 0 and placex.rank_search = bnd.rank_search))
|
||||
AND placex.osm_type = 'N'
|
||||
AND placex.class = 'place'
|
||||
AND placex.linked_place_id is null
|
||||
AND placex.rank_search < 26 -- needed to select the right index
|
||||
AND _st_covers(bnd.geometry, placex.geometry)
|
||||
AND placex.type != 'postcode'
|
||||
AND ST_Covers(bnd.geometry, placex.geometry)
|
||||
LOOP
|
||||
{% if debug %}RAISE WARNING 'Found matching place node %', linked_placex.osm_id;{% endif %}
|
||||
RETURN linked_placex;
|
||||
|
||||
Reference in New Issue
Block a user