Вопрос

Дано:

  • 1 база данных на одного клиента (бизнес-клиент)
  • 5000 клиентов
  • Клиенты имеют от 2 до 2000 пользователей (AVG ~ 100 пользователей / клиент)
  • 100к до 10 миллионов записей в базу данных
  • Пользователям нужно часто искать эти записи (это лучший способ навигации по их данным)

Возможно соответствующая информация:

  • Несколько новых клиентов каждую неделю (в любое время в рабочее время)
  • Несколько веб-серверов и серверов баз данных (пользователи могут войти через любой веб-сервер)
  • Давайте останемся в агностике языка или SQL бренда, поскольку Lucene (и Solr) имеют широту поддержки

Например:

Джоэл Спольский сказал в Подкаст # 11. Что его принятое приложение Web App, Fogbugz по запросу, использует Lucene. У него есть тысячи клиентов по требованию. И каждый клиент получает свою собственную базу данных.

Они используют А.Н. Индекс на клиента и хранить его в базе данных клиента. Отказ Я не уверен в деталях. И я не уверен, что это серьезный мод для Лучена.

Вопрос:

Как бы вы настроили поиск Lucene, чтобы каждый клиент мог только поиск в своей базе данных?

Как бы вы настроили индекс (ES)?
Где вы храните индекс (ES)?
Вам нужно добавить фильтр во все поисковые запросы?
Если клиент отменен, как бы вы удалили их (часть) индекса? (Это может быть тривиальным - еще не уверен)

Возможные решения:

Сделайте индекс для каждого клиента (база данных)

  • Pro: поиск быстрее (чем один-индекс-для всех методов). Индексы относительно размера данных клиента.
  • CON: Я не уверен, что это влечет за собой, и я не знаю, если бы это за пределами объема люкула.

Иметь один гигантский индекс с полем базы данных_name. Всегда включайте Database_name в качестве фильтра.

  • Pro: Не уверен. Может быть, хорошо для технической поддержки или выставления счетов для поиска всех баз данных для информации.
  • CON: поиск медленнее (чем метод индекса-клиента). Ошибка безопасности, если фильтр запроса удален.

Последняя вещь:
Я бы также принял ответ, который использует Соревнования (расширение Лучена). Возможно, это лучше подходит для этой проблемы. Не уверен.

Это было полезно?

Решение

Вы вызвали меня от Fogbugz Stackexchange. Меня зовут Джуд, я текущий поисковый архитектор для Figbugz.

Вот грубая очертания того, как настроен архитектура поиска Fogbugz по запросу [1]:

  • По причинам, связанным с переносимостью данных, безопасностью и т. Д., Мы сохраняем все наши нашими базами данных и индексы требований и индексы.
  • Хотя мы используем Lucene (Lucene.net, на самом деле), мы довольно по существу модилизовали ее бэкэнда, чтобы он мог полностью сохранить свой индекс в базе данных. Кроме того, локальный кеш поддерживается на каждом веб-хост, чтобы ненужные удары баз данных можно избежать по возможности.
  • Наши фильтры практически полностью соответствуют базе данных (поскольку они используются аспектами Fogbugz вне поиска), поэтому наш поисковый анализатор отделяет запросы в полнотекстовые и нефористы, выполняемые компоненты, выполняют поиск и сочетают в себе результаты. Это немного неудачно, так как он пустоты много полезных оптимизаций, которые Lucene способен сделать.

Есть несколько преимуществ для того, что мы сделали. Управление учетными записями довольно прост, поскольку клиентские данные и их индекс хранятся в одном месте. Есть также некоторые негативы, хотя, например, такие как набор поисковых поисков Pesky Edge Pate, которые не допускают отсрочки наших минимальных стандартов. Retrospective, наш поиск был крутым и хорошо сделан для его времени. Однако если я должен был сделать это снова, я бы препятствовать этому подходу.

Просто, если ваш поисковый домен не является особенным или вы готовы посвятить разработчику в головокружительно быстрое поиск, вы, вероятно, будете превзойти превосходным продуктом, таким как Elasticsearch, Solr или Xapian.

Если бы я сделал это сегодня, если мой поисковый домен не был чрезвычайно специфичен, я бы, вероятно, использовал Elasticsearch, Solr или Xapian Для моего поискового поискового поиска моего поиска в базе данных. Что касается того, что, это зависит от ваших вспомогательных потребностей (платформа, тип запросов, расширяемость, толерантность к одному набору причудровков на другой и т. Д.)

На тему одного большого индекса по сравнению с множеством (!) Разбросанными индексами: оба могут работать. Я думаю, что решение действительно лежит с какой архитектурой вы хотите построить, и какую производительность вам нужна. Вы можете быть довольно гибкими, если вы решите, что 2-секундный поисковый ответ является разумным, но как только вы начнете говорить, что что-то более 200 мс недопустимо, ваши параметры начнут быстро исчезнуть. Поддерживая единый большой индекс поиска для всех ваших клиентов, может быть значительно больше эффективный Чем обрабатываю много небольших индексов, это не обязательно быстрее (как вы указали). Я лично чувствую, что в безопасной среде преимущество сохранения отделения ваших клиентов не должно быть недооценена. Когда ваш индекс поврежден, он не принесет все поиски HALT; глупые маленькие жуки не будут выставлять конфиденциальные данные; учетные записи пользователей остаются модульными - легче извлечь набор учетных записей и PLOP их на новый сервер; и т.п.

Я не уверен, что ответил на ваш вопрос, но я надеюсь, что я хотя бы удовлетворил ваше любопытство :-)

1]: В 2013 году Fogbugz начал устанавливать свои возможности поиска и фильтрации elasticsearch. Нам это нравится.

Другие советы

Шалин Шехар Мангар ответил мне на Список рассылки пользователя Solr-пользователь и по личной электронной почте. Шалин - это вкладчик для Solr и автор предстоящей книги Solr в действии.

Его ответ на списке рассылки:

Как бы вы настроили индекс (ES)?

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

Где вы храните индекс (ES)?

Настройка 5K ядер на одной коробке не будет работать. Таким образом, вам нужно будет разделить клиентов на несколько коробок, каждый из которых имеет подмножество сердечников.

Вам нужно добавить фильтр во все поисковые запросы?

Нет, но вам нужно будет отправить запрос на правильный хост (возможно, поможет сопоставление БД)

Если клиент отменен, как бы вы удалили их (часть) индекса? (Это может быть тривиальным - еще не уверен)

С разными ядрами для каждого клиента это было бы довольно легко.

Его ответ по электронной почте:

Я работал над аналогичным использованием в прошлом, и мы использовали многоядерный подход с некоторыми тяжелыми оптимизациями на стороне Solr. Видеть http://wiki.apache.org/solr/lotsofcores. - Я еще не смог протолкнуть эти изменения в Solr.

Я до сих пор неяснут, что именно из 5K баз данных пользователей ищет, почему вам нужен Lucene и размеры данных в каждой базе данных. Но в любом случае я возьму удар:

  1. Вы должны смотреть на MULTICORE SOLR (каждый индекс CORE = 1), и у вас есть уникальный URL для запроса. Аутентификация по-прежнему будет проблемой и одним (взломанным) способом приближения к тому, чтобы его умолчали угадать URL.

  2. Ваши веб-серверы могут запросить экземпляр / CORE SOLR в зависимости от того, к чему у них есть доступ.

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

Емкость

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top