Определить, является ли геолокация подстрокой поисковой строки

У меня есть сайт с контентом, доступным для поиска с помощью панели поиска, работающей от Sphinx Search (упомянуто только потому, что я буду использовать функцию гео-поиска Sphinx).

Поля таблицы включают:

Id, title, description, tags, geolocation

Как я могу определить, содержит ли какая-либо часть строки ссылку на географическое положение? Решение, которое я ищу, скорее всего, будет выполнено на PHP, и затем я буду искать с помощью Sphinx, как обычно.

Например, если кто-то ищет что-либо из следующего:

Car parts in California

Car parts near San Francisco

90210 car parts

Затем я хотел бы иметь возможность вернуть список всех записей, которые соответствуют car parts в определенном радиусе от желаемого местоположения.

Я открыт для любых предложений, как упростить эту проблему.

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


person ServAce85    schedule 03.03.2012    source источник
comment
Два вопроса: 1. Какую географическую зону вам необходимо охватить (местность, США, весь мир)? 2. Вам нужна поддержка на нескольких языках?   -  person AlexC    schedule 03.03.2012
comment
@AlexC Географическое положение всемирно и может быть как общим, как континент, так и конкретным, как город или почтовый индекс (аналогично тому, как Google возвращает карту местоположений, введенных в определенные поисковые запросы). Что касается многоязычной поддержки, то пока все на английском.   -  person ServAce85    schedule 03.03.2012


Ответы (1)


Для этого можно использовать несколько API:

http://www.datasciencetoolkit.org/ ‹- посмотрите на Geodict

http://developer.yahoo.com/geo/placemaker/guide/web-service.html

http://developers.metacarta.com/api/ ‹- посмотрите на Query Parser

... они выполняют всю "тяжелую работу" за вас :)

В качестве альтернативы, можно сделать свое собственное с помощью самого сфинкса!

Загрузите копию базы данных geonames http://www.geonames.org/

Вставьте его в таблицу базы данных и сделайте по нему индекс сфинкса.

Затем возьмите строку запроса и запустите запрос SPH_MATCH_ANY для таблицы geo.

Затем просмотрите набор результатов sphinx и извлеките любые совпадения мест - чтобы сделать новый запрос без названия места.

Этот индекс сфинкса также вернет вам геокоординаты, которые вы можете использовать для реального запроса :)

(вы можете немного оптимизировать его, чтобы специально замечать 'in / near' и либо просто удалить их, либо использовать их для явной идентификации названия места)

Удачи!

(Обработка почтового индекса - тоже может быть проделана таким же образом - также поместите почтовые индексы в индекс сфинкса. Есть загружаемые копии, доступные в Интернете. Или может быть обработана как особый случай - ища номер)

person barryhunter    schedule 03.03.2012
comment
Хотел бы я +2. Кажется, это именно то, что я искал. Мне особенно нравится решение, в котором используется Sphinx. Не могу дождаться, чтобы проверить это. Спасибо! - person ServAce85; 04.03.2012
comment
Я ставлю ему +2. Это было похоже на то, о чем я думал, но он сделал это лучше и раньше. - person AlexC; 07.03.2012
comment
При выполнении SPH_MATCH_ANY против таблицы geo для запроса Springfield, Illinois я получаю результаты для различных Springfield во многих разных состояниях. Очевидно, Спрингфилд, штат Иллинойс, находится в верхней части списка. Выбор верхнего результата работает для этого примера, но должен ли я всегда выбирать только верхний результат для каждого запроса? Что, если пользователь войдет в несколько локаций? Просто ищу предложения. - person ServAce85; 29.03.2012