2015-07-09 7 views
4

Как мы используем Solr: Мы храним документы 7K с атрибутами 3k, прикрепленными к одному документу в solr. Каждый атрибут индексируется на solr, чтобы включить поиск/сортировку по этому атрибуту. Мы извлекаем данные из solr на основе критериев поиска/фильтра с атрибутом 400+, прикрепленным к одному документу. Поэтому, когда мы пытаемся найти какой-либо текст в solr с 1 атрибутом (путем установки fl = "projectId"), для отображения результата на solr-консоли требуется едва ли 1 секунда, что отлично.Как улучшить производительность Solr?

Однако, если мы попытаемся получить атрибут 100+ для тех же критериев поиска (который вернет строку ~ 100 * 3 * нет совпадающего документа (~ 50) из документа 7K с атрибутом 4K), это займет ~ 20 секунд. Но нам нужно получить атрибут 400+ с согласованным документом, он занимает много времени ~ 90 секунд, раньше он сбой из-за outOfMemoryError, который мы исправили, увеличив размер ОЗУ и размер кучи JVM.

синхронизация данных Mysql с Solr: В настоящее время мы используем MySql БД в качестве первичной базы данных и сервера Solr в качестве вторичной базы данных. Мы ежедневно синхронизировали данные mysql с сервером Solr. Мы также обновляем сервер solr всякий раз, когда мы обновляем любой атрибут в Mysql DB.

Использование данных результата solr в приложении: Панель инструментов приложения будет содержать документ с предварительно сконфигурированными столбцами (атрибутами) пользователя. Пользователь может применять критерии поиска/фильтра, чтобы заполнить требуемый результат на своей приборной панели. Поэтому наше приложение пытается получить данные с критериями поиска/фильтрации с сервера solr, обратившись к нему.

Мы пробовали много вещей, таких как увеличение размера кучи, размер оперативной памяти и отсутствие процессора, но не повезло. Данные с каждым днем ​​растут, что вызывает множество проблем. Он работает с небольшим количеством проектов или небольшим атрибутом, но всякий раз, когда мы пытаемся извлечь больше атрибута, это требует слишком много времени, когда-то он разбился.

Я не уверен, правильно ли мы используем индексы?

Может ли кто-нибудь предложить лучший/альтернативный подход? Спасибо заранее.

+0

Сколько данных мы фактически говорим об этом, прикрепленном к каждому документу? Если каждый документ имеет размер МБ, вам придется переносить большие объемы данных при получении списка документов. – MatsLindh

+0

каждый документ содержит ~ 1MB – ManojP

+0

Сколько документов вы возвращаете?вы оценили сохранение сериализованной версии документа в кеше и возвращение, вместо того, чтобы получать фактические данные из Solr или MySQL? – MatsLindh

ответ

5

Вместо того, чтобы получать 400 полей для каждого документа, вы можете вернуть только «идентификатор» каждого документа, а затем получить эти документы из MySQL, который является вашим постоянным хранилищем.

Так для примера, если вы получаете обратно 25 идентификаторы документов за поиск, в приложении вы можете получить 25 докторов из MySQL (может быть сделать параллельный вызов)

По моему опыту, возвращающийся большее количество полей увеличивает qTime много.

+0

Да, я думал об этом же, снова потребуется значительное время для получения данных из mysql, а также – ManojP

+0

@ManojP Solr быстро находит данные, соответствующие вашим условиям. Как только вы узнаете каждый идентификатор, соответствующий вашему условию, MySql ответит незамедлительно, так как ваше единственное условие находится в индексированном столбце (например, id). Затем выборка данных из БД будет быстрее благодаря всем оптимизированным функциям. Анализ синтаксического ответа будет занимать гораздо больше времени, поскольку вам потребуется использовать синтаксический анализатор XML или что-то еще, что намного медленнее. – Random

+0

@ManojP проблема заключается в том, что вы возвращаете слишком много данных из solr. Применение фильтров/граней не поможет. В вашем вопросе вы упомянули, что если вы держите & fl = projectid, это занимает менее 1 секунды. Если вы считаете, что MySQL также займет значительное время, то лучшим вариантом для вас будет просмотр базы данных кэша, такой как Memcached. Когда вы вставляете данные в MySQL/solr, вставьте эти же данные в memcached. После получения projectids из solr, получите документы из memcached. – jay

1

Вы можете попытаться использовать поиск фасета - несколько поисковых запросов, которые уменьшают количество кандидатов при каждом последующем поиске.

Другой способ - использовать фильтры широко.

Если вы можете включить часть запроса в фильтры (fq), что, вероятно, увеличит производительность на хорошем уровне.

+0

ok, я постараюсь добавить критерии поиска/фильтра в fq, я не уверен в поиске фактов? – ManojP

Смежные вопросы