2010-02-15 1 views
8

Я внедряю MS Search Server 2010 и до сих пор его действительно хорошо. Я делаю поисковые запросы через их веб-службу, но из-за несогласованного results, я думаю о кэшировании результата вместо этого.Сохранение результатов поиска для поискового вызова и сортировки

Сайт небольшой интрасети (500 сотрудников), поэтому не должно быть никаких проблем, но им любопытно, какой подход вы бы предприняли, если бы это был более крупный сайт.

У меня есть googled abit, но havent действительно сталкивается с чем-то конкретным. Итак, несколько вопросов:

  • Какие еще существуют подходы? И почему они лучше?
  • Сколько стоит хранить данные 400-500 строк? Какие размеры возможны?
  • Другие моменты, которые вы должны принять во внимание.

Любой вход приветствуется :)

+0

Вы посмотрели на Apache SOLR? –

ответ

2

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

Первый, вам нужен какой-то упорный слой. Если вы используете простой старый веб-сайт, то сеанс пользователя будет наиболее логичным для использования. Если вы используете веб-службы (что означает «без сеанса») и просто совершает вызовы через клиента, тогда вам все равно нужен какой-то прикладной уровень (как общий сеанс) для ваших услуг. Зачем? На этом уровне будет храниться ваш кэш базы данных.

Второй, вам нужен способ кэширования результатов в любом контейнере, который вы используете (сеанс или прикладной уровень веб-служб). Вы можете сделать это несколькими способами ... Если запрос - это то, что может сделать любой пользователь, тогда будет работать простой хэш запроса, и вы можете поделиться этим сохраненным результатом среди других пользователей. Вероятно, вы все еще хотите получить какой-то GUID для результата, чтобы вы могли передать это в своем клиентском приложении, но поиск хэша из запросов к результатам будет полезен. Если эти запросы уникальны, вы можете просто использовать уникальный идентификатор GUID для результата запроса и передать его вместе с клиентским приложением. Это значит, что вы можете выполнять свои функции кэширования ...

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

Третьего, вы будете хотеть какой-то путь к странице вашего объекта результата ... шаблон итератора работает хорошо здесь, хотя, возможно, что-то проще, может работать ... как извлечь X количества результатов, начиная с точкой Y. Однако шаблон Iterator был бы лучше, как вы могли бы затем удалить свой механизм кеширования позже и страницу непосредственно из базы данных, если захотите.

Четвертый, вам нужен какой-то механизм предварительной выборки (как и другие рекомендации). Вы должны запустить поток, который будет выполнять полный поиск, и в вашем основном потоке просто выполните быстрый поиск с верхним X количество элементов. Надеюсь, к тому моменту, когда пользователь попытается выполнить подкачку, второй поток будет завершен, и ваш полный результат теперь будет в кеше. Если результат не готов, вы можете просто добавить простую логику экрана загрузки.

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

Я оставлю вам еще несколько советов ...

  1. Вы не хотите, чтобы посылать весь результат к приложению клиента (если вы используете Ajax или что-то вроде IPhone приложения). Зачем? Хорошо, потому что это огромная трата. Пользователь, вероятно, не собирается просматривать все результаты ... теперь вы просто отправили более 2 МБ полей результатов.

  2. Javascript - это потрясающий язык, но помните, что он по-прежнему является языком сценариев на стороне клиента ... вы не хотите слишком сильно замедлять работу пользователя, отправляя огромное количество данных для вашего клиента Ajax. Просто отправьте предварительно запрограммированный результат на ваш клиент и дополнительные страницы в качестве пользовательских страниц.

  3. Абстракция абстракция абстракция ... вы хотите отвлечь кеш, запрос, пейджинг, предварительную выборку ... столько, сколько сможете. Зачем? Ну давайте скажем, вы хотите переключать базы данных или хотите перейти непосредственно из базы данных, а не использовать объект результата в кеше ... ну, если вы сделаете это правильно, это намного проще изменить позже. Кроме того, при использовании веб-сервисов многие другие приложения могут позже использовать эту логику.

Теперь я, вероятно, предложил переработанное решение для чего вам нужно :). Но, если вы можете это сделать, используя все правильные методы, вы узнаете тонну и получите очень хорошую базу, если хотите расширить функциональность или повторно использовать этот код.

Дайте мне знать, если у вас есть вопросы.

+0

Я забыл ответить. Сожалею. Я использовал кеширование для вызовов веб-службы и сеанса для поиска в веб-сервере. Спасибо за обширный ответ, очень полезно! – Mattias

0

Я должен признать, что я не очень знакомы с MS Search Server, так что это не может применяться. У меня часто бывают ситуации, когда приложение должно было искать сотни миллионов записей для наборов результатов, которые нужно было сортировать, разбивать на страницы и выполнять поиск в SQL Server. Как правило, я делаю два шага. Сначала я беру первые «х» результаты, которые нужно отобразить, и отправить их в браузер для быстрого отображения. Во-вторых, в другом потоке я завершаю полный запрос и перемещаю результаты в временную таблицу, где их можно сохранить и получить быстрее. Любой заданный запрос может иметь тысячи или десятки тысяч результатов, но по сравнению с сотнями миллионов или даже миллиардами общих записей этот меньший поднабор можно легко манипулировать из таблицы temp. Это также снижает нагрузку на другие таблицы по мере возникновения запросов. Если пользователю нужна вторая страница записей или нужно сортировать их или просто хочет подмножество исходного запроса, все это вытащили из таблицы temp.

Затем необходимо ввести логику, чтобы проверить устаревшие временные таблицы и удалить их. Это достаточно просто, и я позволю SQL Server справиться с этой функциональностью. Наконец, логика должна быть введена в действие, когда исходный запрос изменяется (значительные изменения по периметру), так что новый набор данных можно вытащить и поместить в новую таблицу temp для дальнейшего запроса. Все это относительно просто.

Пользователи так привыкли разделять второе время возврата от таких мест, как google, и эта модель дает мне достаточную гибкость для достижения этого, не требуя специализированного программного и аппаратного обеспечения, которое они используют.

Надеюсь, это немного поможет.

0

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

Если вы можете использовать AJAX, набор результатов 500 строк может быть вызван на страницу и выгружен или отсортирован на клиенте. Это может привести к некоторым действительно интересным функциям .... проверить решения datagrid от jQueryUI и Dojo для вдохновения!

И для действительно интенсивных функций, таких как произвольные фильтры регулярных выражений и переупорядочивания столбцов перетаскивания, вы можете полностью освободить сервер.

Загрузка данных в браузер сразу же позволяет вам вызывать вспомогательные данные (предварительный просмотр страниц и т. Д.), Поскольку пользователь «запрашивает» их ....

Основная проблема заключается в том, чтобы ограничить данные, которые вы возвращаете за каждый результат, на то, что вы действительно будете использовать для своих сортов и фильтров.

Возможности безграничны :)

+0

Но, надеюсь, ваш алгоритм поиска принесет хорошие результаты на раннем этапе, поэтому вы загрузите 490 результатов и изображений предварительного просмотра страницы без необходимости –

1

Это звучит как медленная часть поиска является полнотекстовым поиском, а не поиск результата. Как насчет кэширования результирующих идентификаторов записей ресурсов? Кроме того, поскольку может быть правдой, что поисковые запросы часто дублируются, сохраняются хеш поискового запроса, запроса и соответствующих ресурсов. Затем вы можете получить следующую страницу результатов по идентификатору. Работает с AJAX тоже.

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