Я в процессе обновления инструмента, использующего индекс Lucene.В рамках этого обновления мы переходим с Lucene 2.0.0 на 3.0.2.По большей части это было совершенно просто.Тем не менее, в одном случае я не могу найти простое преобразование.
По сути, у меня есть простой запрос, и мне нужно перебрать все попадания.В Lucene 2 это было просто, например:
Hits hits = indexSearcher.search(query);
for(int i=0 ; i<hits.length() ; i++){
// Process hit
}
В Lucene 3 API для IndexSearcher
значительно изменился, и хотя я могу собрать воедино что-то, что работает, это только путем получения вершины X
документы и убедившись, что X
достаточно большой.
Хотя число попаданий (в моем случае) обычно составляет от нуля до десяти, существует аномальная ситуация, когда их число может быть намного выше.Наличие фиксированного лимита для этого кажется неправильным.Кроме того, установка действительно высокого предела приводит к OOME, что означает, что пространство для всех X
возможных попаданий выделяется немедленно.Поскольку эта операция выполняется много , желательно что-то достаточно эффективное.
Редактировать:
В настоящее время у меня работает следующее:
TopDocs hits = indexSearcher.search(query, MAX_HITS);
for (int i=0 ; i<hits.totalHits ; i++) {
// Process hit
}
Это прекрасно работает, за исключением того, что
a) что, если будет больше совпадений, чем MAX_HITS
?
и
b) , если MAX_HITS велик, то я трачу впустую память, так как место для каждого удара выделяется до того, как поиск будет выполнен.
Поскольку большую часть времени будет только несколькохиты, я не против делать последующие поиски, чтобы получить последующие хиты, но я не могу найти способ сделать это.