2013-11-12 4 views
0

У нас есть сайт, на котором пользователи размещают рекламу на вещи, которые они хотят продать, с такими параметрами, как цена, местоположение, название и описание. Затем их можно искать с помощью sphinx и разрешать пользователям указывать min- и maxprice, местоположение с поисковым сервером (с использованием карт Google) и т. Д. Пользователи могут сохранять эти поиски и получать электронные письма, когда появляются новые объявления, соответствующие их поиску. В этом и заключается проблема: мы хотим выполнить обратный поиск каждый раз, когда объявление опубликовано. С ценой, местоположением, названием и описанием в качестве параметров мы хотим выполнить поиск по всем сохраненным «поисковым запросам» и получить те, которые нашли бы объявление. Минимум и maxprice должны выполняться только в запросе, а также в синтаксисе Quorom, чтобы получить все объявления, по крайней мере, 2 или mby всего 1 раз в заголовке/описании. Наша проблема заключается главным образом в геоисследовании. Как найти все поисковые запросы, в которых «поисковые круги» будут включать наше недавно опубликованное местоположение, не выполняя поиск для каждого сохраненного поиска?Sphinx «reverse» search

В этом главный вопрос, любые замечания по нашему предлагаемому решению других проблем также очень приветствуются. Заранее благодарю/Jenny

+0

Как «комментарий» - новым термином для этого типа поиска является перспективный поиск. Эта миграция помогает найти релевантную информацию о предыстории – barryhunter

ответ

0

Стандартная поддержка «гео-поиска» на сфинксе должна работать так же, как и в Перспективном указателе, в качестве обычного ретроспективного поиска.

Построив сфинкс «индекс» всех сохраненных поисков ...

И вы запускаете запрос, используя «объявление» в качестве поискового запроса: - вместо «фильтр», используя фиксированный радиус, вы просто используете радиус из атрибута (т. е. радиус, сохраненный в конкретном запросе) - если использование API can not использует setFilterRange напрямую, необходимо использовать setSelect для создания нового виртуального атрибута.

$cl->setSelect("*,IF(@geodist<radius,1,0) as myfilter"); 
$cl->setFilter('myfilter',array(1)); 

(и да, мин/maxprice только можно сделать с помощью обычных фильтров тоже - просто перевернув логики в том, что вы будете использовать в ретроспективном поиске)

... усложнение находится в «полнотекстовый» запрос, если сохраненный поиск - это нечто большее, чем одно ключевое слово, но вы, похоже, уже выяснили эту часть.

Смежные вопросы