Более

Можно ли ограничить диапазон поиска функции geocode () в PostGIS Tiger Geocoder?

Можно ли ограничить диапазон поиска функции geocode () в PostGIS Tiger Geocoder?


Я обнаружил, что сервер с загруженными данными только с двумя состояниями работает намного быстрее, чем сервер со всеми загруженными состояниями. Моя теория - плохо отформатированный адрес, который не имеет точного совпадения сначала, будет стоить гораздо больше времени, когда геокодер проверит все состояния. Всего с двумя состояниями этот поиск ограничен и остановлен очень рано.

Существуетrestrict_regionпараметр вгеокодироватьФункция выглядит многообещающей, если она может ограничить диапазон поиска, поскольку у меня достаточно информации или оснований полагать, что информация о состоянии во вводе адреса верна. Я написал запрос, пытаясь использовать геометрию одного состояния в качестве ограничивающего параметра:

ВЫБЕРИТЕ геокод ('501 Fairmount DR, Аннаполис, Мэриленд 20137', 1, the_geom) FROM tiger.state ГДЕ statefp = '24';

и сравнил производительность с простой версией

ВЫБРАТЬ геокод ('501 Fairmount DR, Annapolis, MD 20137', 1);

РЕДАКТИРОВАТЬ Обратите внимание, что город и почтовый индекс в этом вводе неверны, что сделано намеренно. Если адрес идеальный, нет смысла ограничивать диапазон поиска, так как геокодер может перейти к нужной таблице с первой попытки. Только эта попытка имеет смысл только в том случае, если почтовый индекс или город неверны.

Я не обнаружил прироста производительности с параметром. Вместо этого он потерял прирост производительности от кэширования, которое обычно происходило от немедленного повторного выполнения того же запроса, потому что все необходимые данные были кэшированы в ОЗУ.

Возможно, я неправильно использую, или этот параметр не предназначен для работы, как я ожидал. Однако, если диапазон поиска может быть ограничен, выигрыш в производительности может быть существенным, так как плохо отформатированные адреса потребовали больше всего времени для геокодирования, и они также часто портят уже кэшированные данные, потому что геокодеру нужно искать состояния, даже все мои входные данные находятся в одном состоянии, и все данные можно кэшировать в ОЗУ.


дракодок

Неудивительно, что фильтр геометрии не повышает производительность. Он был больше разработан для предотвращения сопоставления с областями, где абсолютно адрес не может существовать. Вы можете попробовать упростить геометрию с помощью ST_Simplify, но даже это может не сильно помочь.

В идеале вы можете сначала нормализовать адреса, особенно если ваша проблема - плохая нормализация, а затем фильтровать только те, которые попадают в правильное состояние.

Так что-то вроде:

WITH addys AS (SELECT original_address, normalize (original_address) As addy FROM your_table LIMIT 100) SELECT geocode (addy, 1) FROM addys WHERE (addy) .stateAbbrev = 'MD';

Если он может определить адрес, он должен быть достаточно умен, чтобы сразу перейти к нужным таблицам. Если вы замечаете значительное замедление, убедитесь, что вы проиндексировали и проанализировали вакуум из родительских таблиц. Это часто является причиной медленного геокодирования при добавлении дополнительных состояний. Я сам часто забывал об этом и удивлялся, почему все идет так медленно.

ВЫБРАТЬ install_missing_indexes (); вакуумный анализ подробный tiger.addr; вакуумный анализ подробных тигр. ребер; вакуумный анализ многословных тигров. лица; вакуумный анализ подробных имен тигров; вакуумный анализ подробный tiger.place; вакуумный анализ подробный tiger.cousub; вакуумный анализ подробный tiger.county; вакуумный анализ подробного tiger.state;

Смотреть видео: Copilul care s-a ratacit in padure