Я пытаюсь сопоставить данные почтового адреса, предоставленные пользователем, в набор данных адреса. Я хочу индексировать оба набора данных и присоединяться к индексированному полю. В идеальном мире это будет использовать ключ, состоящий из полного адреса (например, WHERE REF_ADDR = INPUT_ADDR
даст 100 W Main St, Springfield, OH 45502 = 100 W Main St, Springfield, OH 45502
). Конечно, адреса редко бывают идеальными, поэтому у меня есть сценарий, который может учитывать различия с использованием нечеткой логики. Однако, поскольку этот скрипт очень медленный, я хочу уменьшить количество кандидатов из базового набора данных, к которому выполняется процесс сопоставления, прежде чем он будет использоваться. Чтобы найти всех потенциальных кандидатов, я намереваюсь создать индексированный ключ, который выводится из отдельных компонентов адреса, которые будут использоваться для присоединения. Проблема в том, что один ключ не будет захватывать всех возможных кандидатов. Скорее всего, мне нужно создать несколько индексированных ключей, чтобы захватить всех кандидатов.Создание нескольких индексов для объединения таблиц для соответствия нечетким соответствиям
Например, индексированный ключ в форме 100 WMNST 455
для адреса 100 W Main St, Springfield, OH 45502
будет полезен большую часть времени, но может быть любое количество ошибок адреса, которые не будут пойманы таким ключом. Чтобы учесть все потенциальные ошибки, которые распознает процесс сопоставления, мне, вероятно, потребуется реализовать по меньшей мере несколько индексированных ключей для соединения.
Мне интересно, есть ли у кого-нибудь рекомендации по решению этой проблемы. Справочный набор данных состоит из записей 40M, а предоставленные пользователем данные адреса обычно составляют около 10 000 записей. Было бы более эффективным просто использовать LIKE
и OR
запросы в полях адреса в отличие от метода, который я предлагаю? Это не является необычным встретить следующие варианты в последнем набор данных (размещено для скрипта):
Address: 100 W MAIN
City:
Zip: 45502
Address: 100 MAIN ST
City: SPNGFLD
Zip:
Address: 100 W MAIN STREET
City: SPRINGFIELD
Zip: 54502
Address: 100 MAIN
City: NORTHRIDGE
Zip: 45502
Как насчет отдельной таблицы, которая содержит строку для каждого возможного совпадения, ссылок обратно к одной записи исходной таблицы. Когда вы запрашиваете совпадение, вы запрашиваете эту таблицу с единственным индексом. –
Возможные совпадения должны быть получены из справочных данных. Вы говорите, что производят таблицу из возможных совпадений в ссылочных данных, а затем выполняете попытки сопоставления с использованием этой таблицы вместо ссылочных данных, которые содержат связанные данные пользователя? Будет ли это повышать производительность? – user1185790
Вот что я думаю - поэтому, когда вы вставляете '123 E Main' в реальную таблицу, вы должны вставить' 123 Main', '123 East Main', и все же многие другие возможности существуют в вашей новой таблице - каждая из эти записи имеют FK против вашей оригинальной записи. Когда вы запрашиваете запрос, вы запрашиваете новую таблицу. Я не уверен, что производительность будет отличной, но это было бы простое решение, поскольку в одном столбце есть простой индекс, и вся ваша логика для получения возможных совпадений выполняется один раз заранее, а не на лету во время запроса 'select'. –