Как построить поиск с количеством результатов для каждой категории?

Мне нужно показать количество результатов для данной категории и скрыть все категории, которые не дают результатов.

Пример: На этой странице вакансий Yahoo! показано количество результатов в таких категориях, как "Город". , Категория работы, Опыт и т.д.

Я работаю в C#/Asp.Net и боюсь, что наш сервер захлебнется без серьезного кеширования и оптимизации sql.

Как бы вы продвигались вперед, создавая решение, подобное этому?


person comichael    schedule 07.09.2009    source источник
comment
Какой тип базы данных вы используете? Оракл, MySQL и т.д.   -  person Partial    schedule 08.09.2009
comment
Смотрите мой комментарий к ответу Джорджа Мауэра ниже.   -  person comichael    schedule 12.10.2009


Ответы (3)


Я думаю, что вам придется вдаваться в чертовски много деталей о вашей настройке. Вы используете ОРМ? Данные уже в памяти? Как поступает запрос? Что конкретно вас беспокоит? Вы сделали какое-либо профилирование, чтобы определить, что это действительно проблема? Я не могу остановиться на последнем. Убедитесь, что то, чего вы боитесь, является реальной проблемой, прежде чем пытаться найти пути ее решения.

Однако, чтобы попытаться ответить, если вы сделаете что-то вроде этого

_categoryRepository
  .Where(category=>category.Matches(query))
  .Select(category.Items.Count())

Count() будет выполняться только для категорий, где category.Matches(query) возвращает true.

person George Mauer    schedule 07.09.2009
comment
Я создаю решение 7-летней давности без ORM, без объектов, просто старые наборы данных. Общее количество строк велико (10 КБ), поэтому хранить все данные в памяти невозможно. Было бы здорово провести рефакторинг/пересборку для использования DDD/linq, но на это нет времени. Итак... что касается меня, мне нужно добавить запрос для каждого элемента категории в каждой категории (выберите количество (*), где город == '[город]'). И для каждого основного запроса будут буквально сотни таких count-запросов — это меня очень беспокоит. Сегодня сайт достаточно медленный, так что даже если не будет профилирования, я могу угадать результат. - person comichael; 08.09.2009
comment
@comichael - Там, где мало вариантов, мало решений. Если ЕДИНСТВЕННОЕ, с чем вы хотите работать, это SQL, то ЕДИНСТВЕННОЕ доступное решение — это кэширование. По крайней мере, создайте класс репозитория категорий, который скрывает необработанный SQL - его будет легче кэшировать на этом уровне. Кроме того, вы должны профилировать, даже если сайт работает медленно — уверены ли вы, что база данных является узким местом? В приложениях asp.net это обычно что-то другое. - person George Mauer; 08.09.2009

Реляционные базы данных не подходят для таких вещей. Это просто неправильный инструмент для работы. Вместо этого взгляните на Lucene, Solr, Sphinx и т. д.

Я лично рекомендую Solr, с ним очень легко начать работу и с SolrNet вы можете написать многогранное приложение ASP.NET в несколько строк кода.

Отказ от ответственности: я являюсь автором указанной библиотеки.

person Mauricio Scheffer    schedule 07.09.2009

Обычно эти подсчеты выполняются с помощью кэширования. Модель должна иметь триггер при вставке в соответствующие таблицы, а затем обновлять вычисляемое поле с помощью «CurrentCount».

Вы можете добавить дополнительные уровни кэширования в само приложение, чтобы счетчики увеличивались только каждые несколько часов или аналогично.

Это значительно лучше, чем фактический подсчет всех строк каждый раз, но это означает, что вам нужно заранее знать, какие типы данных вы будете подсчитывать, чтобы вы могли предварительно вычислить их.

person Noon Silk    schedule 08.09.2009