forked from hans/Nominatim
Merge pull request #3292 from lonvia/faster-country-search
Speed up country search
This commit is contained in:
@@ -245,6 +245,7 @@ async def _get_tiger(conn: SearchConnection, place_ids: List[int],
|
|||||||
class AbstractSearch(abc.ABC):
|
class AbstractSearch(abc.ABC):
|
||||||
""" Encapuslation of a single lookup in the database.
|
""" Encapuslation of a single lookup in the database.
|
||||||
"""
|
"""
|
||||||
|
SEARCH_PRIO: int = 2
|
||||||
|
|
||||||
def __init__(self, penalty: float) -> None:
|
def __init__(self, penalty: float) -> None:
|
||||||
self.penalty = penalty
|
self.penalty = penalty
|
||||||
@@ -448,6 +449,8 @@ class PoiSearch(AbstractSearch):
|
|||||||
class CountrySearch(AbstractSearch):
|
class CountrySearch(AbstractSearch):
|
||||||
""" Search for a country name or country code.
|
""" Search for a country name or country code.
|
||||||
"""
|
"""
|
||||||
|
SEARCH_PRIO = 0
|
||||||
|
|
||||||
def __init__(self, sdata: SearchData) -> None:
|
def __init__(self, sdata: SearchData) -> None:
|
||||||
super().__init__(sdata.penalty)
|
super().__init__(sdata.penalty)
|
||||||
self.countries = sdata.countries
|
self.countries = sdata.countries
|
||||||
@@ -481,7 +484,14 @@ class CountrySearch(AbstractSearch):
|
|||||||
result.bbox = Bbox.from_wkb(row.bbox)
|
result.bbox = Bbox.from_wkb(row.bbox)
|
||||||
results.append(result)
|
results.append(result)
|
||||||
|
|
||||||
return results or await self.lookup_in_country_table(conn, details)
|
if not results:
|
||||||
|
results = await self.lookup_in_country_table(conn, details)
|
||||||
|
|
||||||
|
if results:
|
||||||
|
details.min_rank = min(5, details.max_rank)
|
||||||
|
details.max_rank = min(25, details.max_rank)
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
async def lookup_in_country_table(self, conn: SearchConnection,
|
async def lookup_in_country_table(self, conn: SearchConnection,
|
||||||
@@ -604,6 +614,8 @@ class PostcodeSearch(AbstractSearch):
|
|||||||
class PlaceSearch(AbstractSearch):
|
class PlaceSearch(AbstractSearch):
|
||||||
""" Generic search for an address or named place.
|
""" Generic search for an address or named place.
|
||||||
"""
|
"""
|
||||||
|
SEARCH_PRIO = 1
|
||||||
|
|
||||||
def __init__(self, extra_penalty: float, sdata: SearchData, expected_count: int) -> None:
|
def __init__(self, extra_penalty: float, sdata: SearchData, expected_count: int) -> None:
|
||||||
super().__init__(sdata.penalty + extra_penalty)
|
super().__init__(sdata.penalty + extra_penalty)
|
||||||
self.countries = sdata.countries
|
self.countries = sdata.countries
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ class ForwardGeocoder:
|
|||||||
log().table_dump('Searches for assignment',
|
log().table_dump('Searches for assignment',
|
||||||
_dump_searches(searches, query, num_searches))
|
_dump_searches(searches, query, num_searches))
|
||||||
num_searches = len(searches)
|
num_searches = len(searches)
|
||||||
searches.sort(key=lambda s: s.penalty)
|
searches.sort(key=lambda s: (s.penalty, s.SEARCH_PRIO))
|
||||||
|
|
||||||
return query, searches
|
return query, searches
|
||||||
|
|
||||||
@@ -85,6 +85,7 @@ class ForwardGeocoder:
|
|||||||
if search.penalty > prev_penalty and (search.penalty > min_ranking or i > 20):
|
if search.penalty > prev_penalty and (search.penalty > min_ranking or i > 20):
|
||||||
break
|
break
|
||||||
log().table_dump(f"{i + 1}. Search", _dump_searches([search], query))
|
log().table_dump(f"{i + 1}. Search", _dump_searches([search], query))
|
||||||
|
log().var_dump('Params', self.params)
|
||||||
lookup_results = await search.lookup(self.conn, self.params)
|
lookup_results = await search.lookup(self.conn, self.params)
|
||||||
for result in lookup_results:
|
for result in lookup_results:
|
||||||
rhash = (result.source_table, result.place_id,
|
rhash = (result.source_table, result.place_id,
|
||||||
|
|||||||
Reference in New Issue
Block a user