mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-03-11 05:14:07 +00:00
correctly exclude streets with housenumber searches
Street result are not subject to the full filtering in the SQL query, so recheck.
This commit is contained in:
@@ -766,9 +766,6 @@ class PlaceSearch(AbstractSearch):
|
|||||||
assert result
|
assert result
|
||||||
result.bbox = Bbox.from_wkb(row.bbox)
|
result.bbox = Bbox.from_wkb(row.bbox)
|
||||||
result.accuracy = row.accuracy
|
result.accuracy = row.accuracy
|
||||||
if not details.excluded or not result.place_id in details.excluded:
|
|
||||||
results.append(result)
|
|
||||||
|
|
||||||
if self.housenumbers and row.rank_address < 30:
|
if self.housenumbers and row.rank_address < 30:
|
||||||
if row.placex_hnr:
|
if row.placex_hnr:
|
||||||
subs = _get_placex_housenumbers(conn, row.placex_hnr, details)
|
subs = _get_placex_housenumbers(conn, row.placex_hnr, details)
|
||||||
@@ -788,6 +785,14 @@ class PlaceSearch(AbstractSearch):
|
|||||||
sub.accuracy += 0.6
|
sub.accuracy += 0.6
|
||||||
results.append(sub)
|
results.append(sub)
|
||||||
|
|
||||||
result.accuracy += 1.0 # penalty for missing housenumber
|
# Only add the street as a result, if it meets all other
|
||||||
|
# filter conditions.
|
||||||
|
if (not details.excluded or result.place_id not in details.excluded)\
|
||||||
|
and (not self.qualifiers or result.category in self.qualifiers.values)\
|
||||||
|
and result.rank_address >= details.min_rank:
|
||||||
|
result.accuracy += 1.0 # penalty for missing housenumber
|
||||||
|
results.append(result)
|
||||||
|
else:
|
||||||
|
results.append(result)
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|||||||
@@ -281,6 +281,37 @@ class TestStreetWithHousenumber:
|
|||||||
assert [r.place_id for r in results] == [2, 92, 2000]
|
assert [r.place_id for r in results] == [2, 92, 2000]
|
||||||
|
|
||||||
|
|
||||||
|
def test_lookup_only_house_qualifier(self, apiobj):
|
||||||
|
lookup = FieldLookup('name_vector', [1,2], 'lookup_all')
|
||||||
|
ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])
|
||||||
|
|
||||||
|
results = run_search(apiobj, 0.1, [lookup], [ranking], hnrs=['22'],
|
||||||
|
quals=[('place', 'house')])
|
||||||
|
|
||||||
|
assert [r.place_id for r in results] == [2, 92]
|
||||||
|
|
||||||
|
|
||||||
|
def test_lookup_only_street_qualifier(self, apiobj):
|
||||||
|
lookup = FieldLookup('name_vector', [1,2], 'lookup_all')
|
||||||
|
ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])
|
||||||
|
|
||||||
|
results = run_search(apiobj, 0.1, [lookup], [ranking], hnrs=['22'],
|
||||||
|
quals=[('highway', 'residential')])
|
||||||
|
|
||||||
|
assert [r.place_id for r in results] == [1000, 2000]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('rank,found', [(26, True), (27, False), (30, False)])
|
||||||
|
def test_lookup_min_rank(self, apiobj, rank, found):
|
||||||
|
lookup = FieldLookup('name_vector', [1,2], 'lookup_all')
|
||||||
|
ranking = FieldRanking('name_vector', 0.3, [RankedTokens(0.0, [10])])
|
||||||
|
|
||||||
|
results = run_search(apiobj, 0.1, [lookup], [ranking], hnrs=['22'],
|
||||||
|
details=SearchDetails(min_rank=rank))
|
||||||
|
|
||||||
|
assert [r.place_id for r in results] == ([2, 92, 1000, 2000] if found else [2, 92])
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('geom', [napi.GeometryFormat.GEOJSON,
|
@pytest.mark.parametrize('geom', [napi.GeometryFormat.GEOJSON,
|
||||||
napi.GeometryFormat.KML,
|
napi.GeometryFormat.KML,
|
||||||
napi.GeometryFormat.SVG,
|
napi.GeometryFormat.SVG,
|
||||||
|
|||||||
Reference in New Issue
Block a user