@MikUrrey

Как осуществить поиск неточных совпадений по MySQL?

Приветствую!
Как осуществить подобного рода поиск по MySQL и реально ли это вообще?

Строка поиска: г Санкт-Петербург, тер Авиагородок
Строка в таблице: Авиагородок, Санкт-Петербург

Строка поиска: г Санкт-Петербург, тер. снт Торики
Строка в таблице: Торики, Красносельский р-н, Санкт-Петербург

Строка поиска: г Санкт-Петербург
Строка в таблице: Санкт-Петербург

Строка поиска: г Москва, Воскресенское п, п Воскресенское
Строка в таблице: Воскресенское поселение, Московская обл.

Плюс, нужно ранжировать - при запросе г Москва результат Москва должен иметь приоритет над результатами Десеновское, Москва и Бутово Южное, Москва.

И т. п., записей около 16 тыс., поиск производится один раз на каждого уника (проект не хайлоад, нишевый интернет-магазин).
Пробовал колдовать с FULLTEXT-поиском, но пока ничего дельного не вышло.
Рассматривается применение сторонних модулей - Sphinx, Elastic, может, даже nosql базы для каких-то промежуточных операций, но рабочей БД проекта является именно MySQL.
Сейчас главное - понять, в какую сторону копнуть.

Всем спасибо, в итоге удалось написать свой алгоритм, основанный на простых условиях и утверждении, что сегменты адреса в наших данных находятся в обратном порядке относительно исходного адреса.
Запрос разбивается по запятым, вырезаются все типы (р-н, район, обл, АО, г, поселок, хутор, снт и .п.), "разворачивается", затем последовательно производится поиск: город+район+регион, город+регион, город. Поиск останавливается на уровне, на котором появился результат.
  • Вопрос задан
  • 609 просмотров
Пригласить эксперта
Ответы на вопрос 4
dimonchik2013
@dimonchik2013
non progredi est regredi
косил Косой косой косой


в Мускуле таких чудесов нету, быть не может, и появится не раньше лет через 15

копайте в стороу как Убер, 2GIs и тот же Яндекс решают эту проблему, если по взрослому ( всякие Entity namig recogntion, Тамита парсер, вектора на стеммированых ковордах и т.п.)

по-детски можно составить алгоритмичеки ( с элементами взрослого) таблицу нормализации:
п Воскресенское =>Воскресенское поселение
Воскресенское п =>Воскресенское поселение


и т.д.
Ответ написан
Возможно вам поможет "нормализация" от различных сторонних API, аля dadata. На вашей стороне хранить нормализированный вариант, а через API dadata приводить к нормальному виду запрос от клиента.
Ответ написан
Adamos
@Adamos
Ну, так и рассматривайте зрелые модули поиска, а не изобретение велосипедов, которые все равно будут неудачнее, да еще и потребуют больше времени на поддержку и доработки.
Теоретически вроде бы и работы немного: разобрать тексты, в которых будешь искать, на базу ключей и искать по ним... но практически тот же Сфинкс это уже умеет делать без танцев с бубном, а что вам еще надо?
Ответ написан
Exploding
@Exploding
wtf?
Когда-то давным давно в древности, написал ответ-простыню на похожий вопрос. Самая эффективная реализация в номинации "из говна и палок".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы