Lucene: как быстро получить пакет документов?

Я пытаюсь построить несколько агрегатов в реальном времени на Lucene в рамках эксперимента. Документы имеют свои значения, хранящиеся в индексе. Это работает очень хорошо для документов до 10K.

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

Тем не менее, было бы здорово иметь возможность это сделать. Итак, в основном мой вопрос: что я могу сделать, чтобы быстрее получать документы из Lucene? Или есть более разумные подходы?

Я уже получаю только те поля, которые мне нужны.

[править] Индекс довольно большой > 50 ГБ. Это не укладывается в памяти. Количество полей разное, у меня несколько типов документов. Агрегирование в основном будет происходить по фиксированному типу документа; но нет возможности заранее сказать, какой из них.


person RobAu    schedule 12.08.2013    source источник
comment
Вы правы в отношении общей цели библиотеки — извлечение десятков тысяч документов с большим количеством полей не является основным использованием. Сколько у вас полей? Каковы ваши ограничения памяти? Можете ли вы позволить себе помещать поля в Field Cache? Это может значительно повысить производительность.   -  person lexk    schedule 12.08.2013


Ответы (1)


Вы поместили индекс в память? Если весь индекс помещается в память, это огромное ускорение.

Как только вы получите хиты (которые возвращаются очень быстро даже для 10 000 записей), я бы открыл несколько потоков/читателей для доступа к ним.

Еще одна вещь, которую я сделал, это сохранить только некоторые свойства в Lucene (т.е. не хранить 50 атрибутов из класса). Иногда вы можете работать быстрее, просто получая список идентификаторов и быстрее получая другой контент из службы/базы данных.

person Bart Czernicki    schedule 13.08.2013
comment
Привет Барт, индекс не помещается в памяти. Я заметил, что сбор docId происходит очень быстро и не является проблемой. Мне нравится идея многопоточного чтения; хотя было бы даже лучше, если бы это можно было сделать быстрее в одном потоке :) - person RobAu; 13.08.2013
comment
@RobAu Еще одна вещь, которую вы можете сделать, это разделить (или разбить) индекс на несколько серверов. Таким образом, вы возвращаете 5k вместо 10k (если у вас есть 2 осколка). Если вы делаете это, Solr может быть лучшим вариантом, поскольку Lucene не имеет встроенного сегментирования. Если вы делаете это в Lucene, вы можете разделить индекс и иметь две веб-службы перед ними и действовать как запись точка для метода поиска Lucene. - person Bart Czernicki; 15.08.2013