Очень низкая производительность Solr при подсветке

У меня есть конфигурация ядра Solr 4.4.0, которая содержит около 630 тыс. документов с оригинальным размером около 10 ГБ. Каждое из полей копируется в поле текст для целей запросов и выделения. Когда я выполняю поиск без выделения, результаты возвращаются примерно в 100 миллисекунд, но когда подсветка включена, тот же запрос занимает 10-11 секунд. Я также заметил, что последующие запросы для тех же терминов продолжали занимать те же 10-11 секунд.

Моя первоначальная конфигурация поля была следующей:

<field name="text" type="text_general" indexed="true" stored="true"
   multiValued="true"
   omitNorms="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true" />

Отправленный запрос похож на следующий

http://solrtest:8983/solr/Incidents/select?q=error+code&fl=id&wt=json&indent=true&hl=true&hl.useFastVectorHighlighter=true

Все мои исследования, похоже, не дают понять, почему производительность подсветки настолько плохая. По прихоти, я решил посмотреть, может ли эффект атрибута omitNorms = true, я изменил поле текст, уничтожил данные и перезагрузился с нуля.

<field name="text" type="text_general" indexed="true" stored="true"
   multiValued="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true" />

Как ни странно, это, казалось, исправить. Первоначальный запрос с подсветкой занял 2-3 секунды, а последующие запросы занимали менее 100 миллисекунд.

Однако, поскольку мы хотим, чтобы omitNorms = true, мое постоянное решение состояло в том, чтобы иметь два копии поля "текст", один с атрибутом и один без. Идея заключалась в том, чтобы выполнять запросы против одного поля и выделять их против другого. Итак, теперь схема выглядит как

<field name="text" type="text_general" indexed="true" stored="true"
   multiValued="true"
   omitNorms="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true" />

<field name="text2" type="text_general" indexed="true" stored="true"
   multiValued="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true" />

И запрос выглядит следующим образом

http://solrtest:8983/solr/Incidents/select?q=error+code&fl=id&wt=json&indent=true&hl=true&hl.fl=text2&hl.useFastVectorHighlighter=true

Снова, данные были очищены и перезагружены с теми же документами 630k, но на этот раз размер индекса составляет около 17 ГБ. (Как и ожидалось, поскольку содержимое в поле "текст" дублируется.)

Проблема в том, что номера производительности возвращаются к исходным 10-11 секундам каждого прогона. Либо первое удаление omitNorms было случайным, либо было что-то еще. Я понятия не имею, что...

Использование jVisualVM для захвата образца ЦП показывает следующие два метода, использующие большую часть CPU

org.apache.lucene.search.vectorhighlight.FieldPhraseList.<init>()    8202 ms (72.6%)
org.eclipse.jetty.util.BlockingArrayQueue.poll()                     1902 ms (16.8%)

Я видел метод init всего 54%, а число опросов достигает 30%.

Любые идеи? Любые другие места, которые я могу посмотреть, чтобы отследить узкое место?

Спасибо

Обновление

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

  • Для ускорения подсветки требуется, чтобы omitNorms не было установлено значение true. (Не знаю, что omitNorms и подсветка имеют отношение друг к другу.)
  • Однако это только кажется правдой, если и запрос, и выделение выполняются в поле same (т.е. df = hl.fl). (Опять же, не знаю, почему...)
  • И еще, однако, только если сделано против поля text по умолчанию, которое существует в схеме.

Вот как я протестировал →

  • Тест был против около 525 000 документов
  • Почти все поля были скопированы в многозначное поле текст
  • В некоторых тестах почти все поля были также скопированы в многозначное поле text2 send (это поле было идентично text > кроме того, что у него была противоположная установка omitNorms
  • Каждый раз, когда конфигурация была изменена, экземпляр Solr был остановлен, папка с данными была удалена, и экземпляр был запущен.

Что я нашел →

  • Когда использовалось только поле text и omitNorms = true было настоящее, производительность была плохая (время отклика 10 секунд)
  • Когда использовалось только поле text и omitNorms = true было не представлено, производительность была отличной (время ответа второй секунды)
  • Если текст имел не, omitNorms = true и text2, запросы с подсветкой подчеркивают текст, возвращенный в подсекунды, все остальные комбинации привели к 10-30-секундному времени отклика.
  • Когда текст имел omitNorms = true и text2 сделал не, все > комбинаций запросов с подсветкой, возвращаемых через 7-10 секунд.

Я смутивюсь.

Ответ 1

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

Мы индексируем текст из кучи бинарных документов и нуждаемся в Solr для поддержки некоторых метаданных о документе, а также в тексте. Пользователи должны искать документы на основе метаданных и полнотекстового поиска в контенте, а также просматривать основные моменты и фрагменты соответствующего контента. Проблема с производительностью ухудшается, если содержимое для выделения/фрагмента расположено далее внутри каждого документа (e.x. стр. 50 вместо страницы 2)

Из-за плохой производительности выделения нам пришлось разбить каждый документ на несколько записей solr. В зависимости от длины поля содержимого мы будем разбивать его на более мелкие фрагменты, копировать атрибуты метаданных в каждую запись и присваивать каждому документу уникальный идентификатор каждой записи. Затем во время запроса мы будем искать в поле содержимого всех этих записей и группировать это уникальное поле, которое мы назначили. Поскольку поле содержимого меньше, Solr не нужно углубляться в каждое поле содержимого, плюс с точки зрения конечного пользователя, это совершенно прозрачно; хотя для нас это немного увеличивает накладные расходы на индексирование.

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

Надеюсь, это поможет.