mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-16 15:47:58 +00:00
adjust rankings for housenumber-only searches
A normal address search with housenumber will use name rankings for the street name. This is slightly different than weighing for address parts. Use the same ranking for the first part of the address for housenumber-only searches to make sure that penalties remain comparable.
This commit is contained in:
@@ -248,7 +248,8 @@ class SearchBuilder:
|
|||||||
yield penalty, exp_count, lookup
|
yield penalty, exp_count, lookup
|
||||||
|
|
||||||
|
|
||||||
def get_name_ranking(self, trange: TokenRange) -> dbf.FieldRanking:
|
def get_name_ranking(self, trange: TokenRange,
|
||||||
|
db_field: str = 'name_vector') -> dbf.FieldRanking:
|
||||||
""" Create a ranking expression for a name term in the given range.
|
""" Create a ranking expression for a name term in the given range.
|
||||||
"""
|
"""
|
||||||
name_fulls = self.query.get_tokens(trange, TokenType.WORD)
|
name_fulls = self.query.get_tokens(trange, TokenType.WORD)
|
||||||
@@ -257,7 +258,7 @@ class SearchBuilder:
|
|||||||
# Fallback, sum of penalty for partials
|
# Fallback, sum of penalty for partials
|
||||||
name_partials = self.query.get_partials_list(trange)
|
name_partials = self.query.get_partials_list(trange)
|
||||||
default = sum(t.penalty for t in name_partials) + 0.2
|
default = sum(t.penalty for t in name_partials) + 0.2
|
||||||
return dbf.FieldRanking('name_vector', default, ranks)
|
return dbf.FieldRanking(db_field, default, ranks)
|
||||||
|
|
||||||
|
|
||||||
def get_addr_ranking(self, trange: TokenRange) -> dbf.FieldRanking:
|
def get_addr_ranking(self, trange: TokenRange) -> dbf.FieldRanking:
|
||||||
@@ -315,11 +316,9 @@ class SearchBuilder:
|
|||||||
sdata = dbf.SearchData()
|
sdata = dbf.SearchData()
|
||||||
sdata.penalty = assignment.penalty
|
sdata.penalty = assignment.penalty
|
||||||
if assignment.country:
|
if assignment.country:
|
||||||
tokens = self.query.get_tokens(assignment.country, TokenType.COUNTRY)
|
tokens = self.get_country_tokens(assignment.country)
|
||||||
if self.details.countries:
|
if not tokens:
|
||||||
tokens = [t for t in tokens if t.lookup_word in self.details.countries]
|
return None
|
||||||
if not tokens:
|
|
||||||
return None
|
|
||||||
sdata.set_strings('countries', tokens)
|
sdata.set_strings('countries', tokens)
|
||||||
elif self.details.countries:
|
elif self.details.countries:
|
||||||
sdata.countries = dbf.WeightedStrings(self.details.countries,
|
sdata.countries = dbf.WeightedStrings(self.details.countries,
|
||||||
@@ -333,24 +332,54 @@ class SearchBuilder:
|
|||||||
self.query.get_tokens(assignment.postcode,
|
self.query.get_tokens(assignment.postcode,
|
||||||
TokenType.POSTCODE))
|
TokenType.POSTCODE))
|
||||||
if assignment.qualifier:
|
if assignment.qualifier:
|
||||||
tokens = self.query.get_tokens(assignment.qualifier, TokenType.QUALIFIER)
|
tokens = self.get_qualifier_tokens(assignment.qualifier)
|
||||||
if self.details.categories:
|
if not tokens:
|
||||||
tokens = [t for t in tokens if t.get_category() in self.details.categories]
|
return None
|
||||||
if not tokens:
|
|
||||||
return None
|
|
||||||
sdata.set_qualifiers(tokens)
|
sdata.set_qualifiers(tokens)
|
||||||
elif self.details.categories:
|
elif self.details.categories:
|
||||||
sdata.qualifiers = dbf.WeightedCategories(self.details.categories,
|
sdata.qualifiers = dbf.WeightedCategories(self.details.categories,
|
||||||
[0.0] * len(self.details.categories))
|
[0.0] * len(self.details.categories))
|
||||||
|
|
||||||
if assignment.address:
|
if assignment.address:
|
||||||
sdata.set_ranking([self.get_addr_ranking(r) for r in assignment.address])
|
if not assignment.name and assignment.housenumber:
|
||||||
|
# housenumber search: the first item needs to be handled like
|
||||||
|
# a name in ranking or penalties are not comparable with
|
||||||
|
# normal searches.
|
||||||
|
sdata.set_ranking([self.get_name_ranking(assignment.address[0],
|
||||||
|
db_field='nameaddress_vector')]
|
||||||
|
+ [self.get_addr_ranking(r) for r in assignment.address[1:]])
|
||||||
|
else:
|
||||||
|
sdata.set_ranking([self.get_addr_ranking(r) for r in assignment.address])
|
||||||
else:
|
else:
|
||||||
sdata.rankings = []
|
sdata.rankings = []
|
||||||
|
|
||||||
return sdata
|
return sdata
|
||||||
|
|
||||||
|
|
||||||
|
def get_country_tokens(self, trange: TokenRange) -> List[Token]:
|
||||||
|
""" Return the list of country tokens for the given range,
|
||||||
|
optionally filtered by the country list from the details
|
||||||
|
parameters.
|
||||||
|
"""
|
||||||
|
tokens = self.query.get_tokens(trange, TokenType.COUNTRY)
|
||||||
|
if self.details.countries:
|
||||||
|
tokens = [t for t in tokens if t.lookup_word in self.details.countries]
|
||||||
|
|
||||||
|
return tokens
|
||||||
|
|
||||||
|
|
||||||
|
def get_qualifier_tokens(self, trange: TokenRange) -> List[Token]:
|
||||||
|
""" Return the list of qualifier tokens for the given range,
|
||||||
|
optionally filtered by the qualifier list from the details
|
||||||
|
parameters.
|
||||||
|
"""
|
||||||
|
tokens = self.query.get_tokens(trange, TokenType.QUALIFIER)
|
||||||
|
if self.details.categories:
|
||||||
|
tokens = [t for t in tokens if t.get_category() in self.details.categories]
|
||||||
|
|
||||||
|
return tokens
|
||||||
|
|
||||||
|
|
||||||
def get_near_items(self, assignment: TokenAssignment) -> Optional[dbf.WeightedCategories]:
|
def get_near_items(self, assignment: TokenAssignment) -> Optional[dbf.WeightedCategories]:
|
||||||
""" Collect tokens for near items search or use the categories
|
""" Collect tokens for near items search or use the categories
|
||||||
requested per parameter.
|
requested per parameter.
|
||||||
|
|||||||
Reference in New Issue
Block a user