не простой фильтр поиска

Тема в разделе "Как сделать...", создана пользователем Casper_R, 15 авг 2015.

  1. Casper_R

    Casper_R Создатель

    Регистр.:
    3 май 2007
    Сообщения:
    85
    Симпатии:
    25
    Всем привет. Вопрос у меня более теоретический :)

    Попалась задача сделать фильтр поиска, +- аналогичный поиску работы на сайте http://www.totaljobs.com/ (не сочтите за рекламу)

    Для простоты формирования Вопроса я уже добавил там пару условий поиска - http://www.totaljobs.com/JobSearch/...Type1=10&Rate=40000&RateType=1&ValidFromDay=1

    Я не могу вникнуть, как они в левом поисковом блоке к каждому пункту фильтра в скобочках указывают кол-во результатов поиска, если этот пункт будет применен?
    Обычно такие фильтры в инете выглядят так:
    - ставишь какой-то параметр поиска
    - выполняется AJAX запрос с выбранными параметрами, который считает кол-во результатов

    А тут уже все посчитано... ну не делают же они over 50 дополнительных запросов на просчет каждого варианта поиска ... блин как???
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.034
    Симпатии:
    2.035
    Применяют условия с count(`id`) вместо выборки

    И это можно легко закэшировать...
     
  3. Casper_R

    Casper_R Создатель

    Регистр.:
    3 май 2007
    Сообщения:
    85
    Симпатии:
    25
    немного не верно сформулировал. как посчитать кол-во результатов, знают все :) суть вопроса в этом "ну не делают же они over 50 дополнительных запросов на просчет каждого варианта поиска". Сейчас гуглю, вроде это называется "Facets Search" или "Layered Navigation"... Что то есть тут - http://www.mightywebdeveloper.com/coding/faceted-navigation-in-php-mysql/, но чаще встречается отсылка к поисковому движку Sphinx
     
    Горбушка нравится это.
  4. Aglok

    Aglok ∞³

    Регистр.:
    9 янв 2012
    Сообщения:
    160
    Симпатии:
    46
    Интересно. Как я понял основано на создании промежуточной таблицы, в которой проиндексированы имена полей.
    В php-mysql достигается умным объединением полей join. Таким образом достаточно сделать один запрос чтобы проверить текущее количество товаров.
    Пример:
    1. Создаётся таблица.
    Код:
    `products` (`id`, `name`, `type`, `brand`, `colour`)
    2. К ней создается промежуточная таблица которая имеет в базе имена полей первой таблицы.
    Код:
    `product_facets` (`id`, `name`) VALUES
    (1, 'type'),
    (2, 'brand'),
    (3, 'colour');
    3. Объединяются таблицы и выводится одним запросом в 3ую таблицу для фильтра:
    Код:
    `product_facts` (`product_id`, `facet_id`, `facet_name`, `value`)