Нечеткий поиск уличных адресов с использованием MySQL Fulltext (или sphinx?)

У меня есть таблица базы данных, полная адресов из ответов геокодирования Google Maps. Google сокращает все направления (Запад -> W, Восток -> E и т. д.).

Поэтому, если я ввожу адрес, например «100 West Pender Street», тогда форматированный адрес, возвращаемый Google Maps, будет «100 W Pender St», который я вставляю в свою таблицу.

Теперь, если пользователь приходит и ищет этот адрес, все следующее должно совпадать:

Пендер-стрит Уэст Пендер-стрит 100 Пендер 100 Вт Пендер 100 Вест Пендер

и они более или менее делают. Однако буква «w» в таблице игнорируется, поскольку она меньше минимальной длины слова. адресам, попадающим на восток, присваивается равный вес в результатах поиска (буква «E» также игнорируется).

Как лучше всего справиться с этим?

Я подозреваю, что установка минимальной длины слова на 1 - это "плохо".

Я мог бы выполнить поиск и заменить известные сокращения (N, E, S, W, St, Ave, Dr и т. д.) в адресах Google и заменить их их расширениями, но есть некоторые названия улиц, где это не так. действительно (в некоторых городах однобуквенные названия улиц: J Street и т. д.)

Кроме того, такие адреса, как «123 160 St», вообще недоступны для поиска, потому что номер улицы (123) и название улицы (160) меньше минимальной длины слова.

Является ли MySQL FullText правильным подходом для этого? Предлагает ли Sphinx что-то лучше?

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


person emh    schedule 31.10.2011    source источник
comment
Вы можете уменьшить минимальную длину полнотекстового слова mysql с помощью ft_min_word_length, но уменьшение ее до 2 или 1 увеличит количество результатов шума. Также будьте осторожны с сокращениями. В моем городе есть Западный Полумесяц, так как это было имя человека, а не направление.   -  person Marc B    schedule 31.10.2011
comment
Почему бы не создать новое поле с направлением (N,E,W,S), а затем выполнить поиск с помощью field = 'S' или если при множественном поиске используется поле IN ('S', 'N ')   -  person David Bélanger    schedule 31.10.2011
comment
Марк – меня беспокоит шум, особенно если мне нужно установить значение 1 для захвата севера, востока, юга, запада. Дэвид – в адресах, возвращаемых геокодером, нет направления в виде отдельного поля, поэтому я пришлось бы анализировать его из полного текстового поля, что может быть проблематично для улиц, которые на самом деле называются N или E и т. д.   -  person emh    schedule 31.10.2011