Используя как кэш второго уровня (с использованием провайдера memcached), так и дополнение NHibernate.Search, мне кажется, вы могли бы извлечь выгоду из обоих.
Компонент NHibernate.Search зависит от Lucene.Net, и поиск по ключевым словам отделен от собственной базы данных. Для каждого сопоставленного класса создается отдельный индексный файл, и оптимизация может быть задана на уровне свойств с использованием атрибутов, что обеспечивает дополнительный уровень детализации. Кроме того, вы можете реализовать лучшее соответствие и предложения (отметьте Lucene в действии и / или Hibernate Search в действии). Как примечание, вам не нужно поддерживать индекс (если вы явно не запросите перестроение индекса); реализация управляет всем негласно, хотя вы можете манипулировать индексом, если хотите. Таким образом, добавление / удаление / обновление продукта автоматически обновит соответствующий индекс.
Для кэша второго уровня вы получаете мгновенное повышение производительности. В тестовой среде с набором данных приблизительно в 2 млн строк у меня было улучшение более чем на 20% даже при крайне низком количестве запросов. Повышение производительности постепенно увеличивается по мере увеличения количества запросов - приложение сначала обращается к кэшу 2-го уровня, а если оно не находит его, затем обращается к БД, чтобы извлечь необходимые строки и вставить их в кэш для будущих запросов. Опять же, вы можете управлять такими вещами, как длительность кеша и другие параметры конфигурации, а также явно очищать кеш (весь, часть или отдельные записи), если вы хотите это сделать. Обратите внимание, что состояние кэша управляется приложением во время сохранения / обновления / удаления.
Для масштабируемости
* кэш 2-го уровня зависит от провайдера (т.е. memcached обладает высокой производительностью и масштабируемостью и поддерживает распределенные экземпляры).
* для Lucene.Net/NHibernate.Search вам нужно будет установить определенное место, в котором будут размещаться индексы, и это место должно быть доступно для чтения / записи всеми экземплярами веб-приложения. Обратите внимание, что чувствительная ссылка - это ввод-вывод и конфликт файлов, поэтому настройка компьютера с файловой системой, работающей быстрее, чем легкая, предотвратит это (я говорю о вашем сценарии со многими тысячами поисковых запросов в секунду)
В качестве примечания я бы настоятельно рекомендовал NHibernate.Search, поскольку он чрезвычайно быстр, чем запросы LIKE, и его проще использовать, чем реализацию полнотекстового поиска SQL-Server внутри приложения (что я и сделал).