Вы вызвали меня из FogBugz StackExchange. Меня зовут Джуд, я в настоящее время поисковый архитектор FogBugz.
Вот примерный план настройки архитектуры поиска FogBugz On Demand [1]:
- По причинам, связанным с переносимостью данных, безопасностью и т. Д., Мы разделяем все наши базы данных и индексы по требованию.
- Хотя мы используем Lucene (фактически Lucene.NET), мы довольно существенно изменили его бэкэнд, чтобы он мог полностью хранить свой индекс в базе данных. Кроме того, на каждом веб-хосте поддерживается локальный кэш, поэтому при любой возможности можно избежать ненужных обращений к базе данных.
- Наши фильтры почти полностью на стороне базы данных (поскольку они используются аспектами FogBugz вне поиска), поэтому наш анализатор поиска разделяет запросы на полнотекстовые и не полнотекстовые компоненты, выполняет поиск и объединяет результаты, достижения. Это немного прискорбно, так как аннулирует много полезных оптимизаций, которые способен сделать Lucene.
В том, что мы сделали, есть несколько преимуществ. Управлять учетными записями довольно просто, поскольку данные клиента и их индекс хранятся в одном месте. Однако есть и некоторые негативы, такие как набор действительно досадных крайних поисков, которые не соответствуют нашим минимальным стандартам. Ретроспективно наш поиск был классным и хорошо выполненным для своего времени. Однако, если бы я сделал это снова, я бы не одобрил этот подход .
Проще говоря, если ваш поисковый домен не очень особенный или вы не хотите посвятить разработчика невероятно быстрому поиску, вы, вероятно, выиграете у превосходного продукта, такого как ElasticSearch, Solr или Xapian.
Если бы я делал это сегодня, если бы мой поисковый домен не был чрезвычайно конкретным, я бы, вероятно, использовал бы ElasticSearch, Solr или Xapian для своего решения для полнотекстового поиска на основе базы данных. Что касается того, что зависит от ваших вспомогательных потребностей (платформа, тип запросов, расширяемость, допуск для одного набора причуд над другим и т. Д.)
По теме один большой индекс против многих (!) Разбросанных индексов: оба могут работать. Я думаю, что решение действительно зависит от того, какую архитектуру вы хотите построить и какую производительность вам нужно. Вы можете проявить большую гибкость, если решите, что 2-секундный ответ на поиск является разумным, но как только вы начнете говорить, что что-то более 200 мс неприемлемо, ваши варианты начинают довольно быстро исчезать. Хотя ведение единого большого поискового индекса для всех ваших клиентов может быть намного эффективнее , чем обработка множества небольших индексов, это не обязательно быстрее (как вы указали). Я лично чувствую, что в безопасной среде преимущество сохранения данных вашего клиента нельзя недооценивать. Когда ваш индекс будет поврежден, он не остановит весь поиск; маленькие глупые ошибки не будут раскрывать конфиденциальные данные; учетные записи пользователей остаются модульными - проще извлечь набор учетных записей и перенести их на новый сервер; и т.д.
Я не уверен, что это ответило на ваш вопрос, но я надеюсь, что, по крайней мере, удовлетворило ваше любопытство: -)
[1]: В 2013 году FogBugz начал использовать возможности поиска и фильтрации с ElasticSearch. Нам это нравится.