У меня есть конфигурация ядра 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 секунд.
Я смутивюсь.