From d48ea4f22cd60206613c193dd6aa2dd5e92029bd Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Mon, 17 Jul 2023 11:45:35 +0200 Subject: [PATCH] disallow address searches that start with a postcode These are postcode searches and nothing else. --- nominatim/api/search/token_assignment.py | 30 +++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/nominatim/api/search/token_assignment.py b/nominatim/api/search/token_assignment.py index 7f75505c..edddd100 100644 --- a/nominatim/api/search/token_assignment.py +++ b/nominatim/api/search/token_assignment.py @@ -257,6 +257,26 @@ class _TokenSequence: return True + def _get_assignments_postcode(self, base: TokenAssignment, + query_len: int) -> Iterator[TokenAssignment]: + """ Yield possible assignments of Postcode searches with an + address component. + """ + assert base.postcode is not None + + if (base.postcode.start == 0 and self.direction != -1)\ + or (base.postcode.end == query_len and self.direction != 1): + log().comment('postcode search') + #
, should give preference to address search + if base.postcode.start == 0: + penalty = self.penalty + self.direction = -1 # name searches are only possbile backwards + else: + penalty = self.penalty + 0.1 + self.direction = 1 # name searches are only possbile forewards + yield dataclasses.replace(base, penalty=penalty) + + def get_assignments(self, query: qmod.QueryStruct) -> Iterator[TokenAssignment]: """ Yield possible assignments for the current sequence. @@ -271,15 +291,7 @@ class _TokenSequence: # Postcode search (postcode-only search is covered in next case) if base.postcode is not None and base.address: - if (base.postcode.start == 0 and self.direction != -1)\ - or (base.postcode.end == query.num_token_slots() and self.direction != 1): - log().comment('postcode search') - #
, should give preference to address search - if base.postcode.start == 0: - penalty = self.penalty - else: - penalty = self.penalty + 0.1 - yield dataclasses.replace(base, penalty=penalty) + yield from self._get_assignments_postcode(base, query.num_token_slots()) # Postcode or country-only search if not base.address: -- 2.39.5