Вы можете использовать Collectors.groupingBy()
и написать пользовательские Collector
:
<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter) {
return getUserStream().collect(
Collectors.groupingBy(
c -> c.getName(),
Collector.of(
ArrayList::new, //init accumulator
(list, c)-> c.getUsers() //processing each element
.stream()
.map(converter)
.forEach(list::add),
(result1, result2) -> { //confluence 2 accumulators
result1.addAll(result2); //in parallel execution
return result1;
}
)
)
);
}
У думающего Сфинкса есть более краткий синтаксис для определения, какие поля и какие модели индексируются.
у И UltraSphinx и Думающего Сфинкса (недавно) есть ультразамечательная функция, которая принимает во внимание географическую близость объектов.
UltraSphinx имеет раздражающие проблемы с тем, как он загружает модели (он не загружает весь стек Rails, таким образом, Вы могли стать странными и твердыми диагностировать ошибки, которые обрабатываются путем добавления явный require
операторы).
Мы используем Думающего Сфинкса на новых проектах и UltraSphinx на проектах, которые используют гео-содержание.
Я прохожу этот точный процесс прямо сейчас поэтому, в то время как у меня нет фактического опыта, я провел много часов, исследуя все опции. Вот то, что я изучил до сих пор:
, у меня есть электронная таблица с моей попыткой документирования преимуществ и недостатков всех их. Если кто-либо интересуется наблюдением его и/или помощью мне исправить его, просто свяжитесь со мной. Я отправлю его где-нибудь, после того как я знаю его точное.
Моя рекомендация состояла бы в том, чтобы попробовать UltraSphinx или Думающего Сфинкса, если у Вас есть нормальные первичные ключи. Я собираюсь попробовать Acts_As_Xapian на основе хорошей документации, набора функций, и как активный проект, кажется.
Я только использовал комбинацию Ferret/acts_as_ferret (решение прежней версии) на клиентском проекте. Я настоятельно рекомендую смотреть другой опции сначала.
aaf очень хрупок и может принести Ваше приложение для направляющих к визжащему останову, если Вы делаете ошибку в конфигурации или если по некоторым причинам Вы поражаете ошибку в aaf.
В таком случае, вместо того, чтобы просто иметь функциональность поиска, гадящую, любое действие контроллера, касающееся индексируемой модели, полностью приведет к сбою и повысит исключение. Который блеется, hmkay?
Твердая опция, используемая одним из моих друзей, Solr, поисковая система с помощью исходного основанного на Java Lucene. Для использования его с направляющими, существует, конечно, acts_as плагин, acts_as_solr.
Он недавно представил комбинацию в Монреаль на направляющих и дает хороший и полный обзор , как использовать acts_as_solr на его блоге .
, Это, по-видимому, поддерживает французские диакритические знаки очень хорошо, также.
Этот вопрос задали ранее здесь с более подробными ответами.
Я использовал Думающего Сфинкса, и это кажется довольно хорошим, но у меня не было времени для оценки всех опций.
Думающий Сфинкс является лучшей альтернативой, чем Ультрасфинкс, который кажется брошенным, но в целом Xapian имеет более мощный двигатель, чем Сфинкс и легче для реализации поиска в реальном времени.
Я использую другую опцию, которая была разработана удивительно хорошо. Я использую jruby и говорю с lucene непосредственно.
я использовал acts_as_solr в прошлом и столкнулся с некоторыми проблемами. главным образом это делает синхронный призыв к каждому AR, сохраняют. Это не слишком плохо, но в моей ситуации сохранение иногда вызывало много синхронных вызовов к solr и будет иногда занимать больше времени, чем полукровка позволила бы, и я получу исключение тайм-аута полукровки (или что-то как этот)
Это зависит, на какой базе данных Вы используете. Я рекомендовал бы использовать Solr, поскольку он предлагает много хороших опций для нечеткого поиска и имеет большой анализатор запроса. Оборотная сторона - Вы, должны выполнить отдельный процесс для него. Я использовал Хорька также, но нашел, что это менее стабильно с точки зрения многопоточного доступа к индексу. Я не попробовал Сфинкса, потому что он только работает с MySQL и Пост-ГРЭС.
Мы используем http://hyperestraier.sourceforge.net/ , который был наследован. Не изучили другие механизмы, но hyperestraier обеспечивает все необходимые рычаги. Установка поискового индекса является сложной все же. Вероятно, более легкие доступные опции.
Я использовал Хорька, и он работал хорошо на мои цели, но я не оценил другие опции.
Я использую acts_as_ferret. Легко настроить и обычно быстро. Встроенная активная рекордная функциональность находки довольно полезна: можно применить любые условия или присоединиться к другим моделям после того, как поиск найдет записи соответствия.
В отличие от сфинкса, Вы не должны повторно индексировать ВСЕ свои записи, когда Вы добавляете новые данные. Существует after_save и рычаги after_update, которые вставят Вашу новую запись в дб хорька. Это было одним из привлекательных для покупателя качеств для меня.
, Когда Вы действительно имеете к массе, индексируют Ваши данные, хорек определенно медленнее, чем acts_as_sphinx (фактором 3). Я закончил тем, что писал свой собственный метод, чтобы повторно индексировать модели, который работает с такой скоростью, как сфинкс - он в основном предварительно загружает все данные из DB вместо записи движения записью для создания нового индекса.
документация хорька хороша для основ, но это немного редко, после того как Вы входите в более сложные поиски, виды и использование dRb сервера для хостинга удаленного индекса. Однако это чувствует намного более сформировавшийся продукт, чем acts_as_sphinx, хотя я ограничил опыт со сфинксом.
Опцией, которую я не попробовал, является C++, базирующийся Xapian
Я рекомендую Думать Сфинкс. Это - самая быстрая опция, по-моему.
Я использую плагин acts_as_xapian. Я следовал этому учебному руководству:
http://locomotivation.com/2008/07/23/simple-ruby-on-rails-full-text-search-using-xapian
Работы очень хорошо.
Я рекомендую actions_as_ferret. Но хотя сложная часть состоит в том, чтобы запустить его и успешно запустить на вашем сервере, после этого у вас вряд ли возникнет проблема, поскольку сервер хорька будет работать как отдельный фоновый процесс, чтобы обновлять ваш индекс каждый раз, когда появляется новое обновление. Кроме того, он отлично работает в mongrel с apache для нас.
Я тоже искал идеальное решение. Сначала я выбрал Thinking Sphinx, который отлично работал. Но поскольку я намерен разместить свое веб-приложение на Heroku , единственный вариант - использовать Solr . Однако самым большим недостатком является то, что разработка основного гема plays_as_solr , похоже, была остановлена после мая 2008 года. Так что, на мой вкус, это уже слишком старомодно. Я только что нашел Sunspot в качестве продвинутой альтернативы и с недавними обновлениями, так что я собираюсь рассмотреть этот вариант.
Другой вариант, который предлагает Heroku, - это использовать размещенный сервер индексирования на основе Solr с именем Websolr . Требуемый гем websolr-plays_as_solr также, к счастью, очень актуален.
Если вы используете служба виртуального хостинга, такая как я (Bluehost), ваши возможности могут быть ограничены тем, что предлагает провайдер. В моем случае я не смог найти хороший и надежный способ запустить и поддерживать работу отдельного сервера, такого как Lucene или Solr.
Поэтому я выбрал Ксапиана, и у меня это хорошо получалось. Я изучил 2 плагина для рельсов: act_as_xapian и xapian_fu. Первый поможет вам быстро начать работу, но, похоже, он больше не поддерживается. Я только начал работать с xapian_fu.