Как сопоставить адреса улиц в SQL Server? - PullRequest
4 голосов
/ 20 января 2010

У нас есть столбец для адресов улиц:

123 Maple Rd.
1-я пр., 321
и т.д ...

Есть ли способ сопоставить эти адреса с данным входом? Введенным будет адрес улицы, но он может быть не в том же формате. Например:

123 Maple Road
1-я Авеню, 321

Наша первая мысль - убрать ввод всех уличных терминов (rd, st, ave, blvd и т. Д.).

Очевидно, что это не всегда будет надежно совпадать. Существуют ли другие способы сопоставления уличных адресов в SQL-сервере?

Мы можем использовать пользовательские функции, хранимые процедуры и обычный старый t-sql. Мы не можем использовать clr.

Ответы [ 7 ]

5 голосов
/ 20 января 2010

Вы можете рассмотреть возможность использования алгоритма Левенштейна .

Вы можете создать его как пользовательскую функцию в SQL Server, где он будет возвращать количество операций, которые необходимо выполнить над String_A, чтобы он стал String_B.Затем вы можете сравнить результат функции расстояния Левенштейна с некоторым фиксированным порогом или с некоторым значением, полученным из длины строк.

Вы можете просто использовать его следующим образом:

... WHERE LEVENSHTEIN(address_in_db, address_to_search) < 5;

Как Марк Байерс предложил , преобразование переменных терминов в каноническую форму поможет при использовании расстояния Левенштейна.

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

Возможно, вы захотите проверить следующую реализацию расстояния Левенштейна для SQL Server:

Примечание. Для реализации вышеупомянутой реализации вам потребуется реализовать функцию MIN3.Вы можете использовать следующее:

CREATE FUNCTION MIN3(@a int, @b int,  @c int)
RETURNS int
AS
BEGIN
    DECLARE @m INT
    SET @m = @a

    IF @b < @m SET @m = @b
    IF @c < @m SET @m = @c

    RETURN @m
END

Вам также может быть интересно ознакомиться со следующими статьями:

5 голосов
/ 20 января 2010

Вместо того, чтобы отбирать вещи, которые могут быть переменными, попытайтесь преобразовать их в «каноническую форму», которую можно сравнить.

Например, замените «rd» или «rd».с «дорогой» и «st» или «st.»с «улицей» перед сравнением.

3 голосов
/ 20 января 2010

Я думаю, что первый шаг для вас - лучше определить, насколько великодушны вы или нет в отношении разных адресов. Например, какие из них соответствуют, а какие нет:

123 Maple Street
123 Maple St
123 maple street
123 mpale street
123 maple
123. maple st
123 N maple street
123 maple ave
123 maple blvd

Есть ли Мэйпл-стрит и Мэйпл-булд в одном районе? А как насчет Оук-стрит против бульвара Оук

Например, там, где я живу, много улиц / дорог / бульваров / проспектов, которые называются Овассо. Я живу на улице Овассо, которая соединяется с бульваром Северный Овассо, который соединяется с бульваром Южный Овассо. Однако есть только один проспект Виктории.

Учитывая эту реальность, вы должны либо иметь базу данных всех названий дорог, и искать ближайшую дорогу (и разбираться с номером отдельно)

OR

Примите решение заранее, на чем вы будете настаивать, а на чем не будете.

2 голосов
/ 20 января 2010

Удаление данных - плохая идея.Во многих городах будут десятки вариаций одной и той же улицы - Оук-стрит, Оук-роуд, Оук-лейн, Оук-Серкл, Оук-Корт, Оук-Авеню и т. Д. Как уже упоминалось выше, переход на каноническое сокращение USPS - лучший подход.

2 голосов
/ 20 января 2010

Для правильного сопоставления улиц вам необходимо привести свои адреса в стандартизированную форму. Посмотрите почтовые стандарты USPS здесь (я предполагаю, что вы имеете дело с адресами США). Это ни в коем случае не простой процесс, если вы хотите иметь возможность работать со ВСЕМИ типами почтовых адресов США. Существует программное обеспечение от таких компаний, как QAS и Satori Software, которое вы можете использовать для стандартизации. Вам нужно будет экспортировать свои адреса, запустить их через программное обеспечение, а затем загрузить базу данных с обновленными адресами. Есть также сторонние поставщики, которые также будут выполнять стандартизацию адресов. Это может быть излишним из-за того, что вы пытаетесь сделать, но это лучший способ сделать это. если адреса в вашей базе данных стандартизированы, у вас будет больше шансов сопоставить их (особенно если вы также можете стандартизировать ввод).

1 голос
/ 20 января 2010

Вы можете попробовать SOUNDEX, чтобы убедиться, что это сблизит вас. http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

...