Skip to content

Commit b7a2325

Browse files
authored
Lucene 9 upgrade (#4867)
* lucene 9.10.0 * lucene 9.11.0 * lucene 9.11.1 * lucene 9.12.0 * lucene 9.12.3 * try to make SuggestResultCollector generic * try to avoid second search/full scan in searchIndex
1 parent 6b289de commit b7a2325

File tree

4 files changed

+40
-14
lines changed

4 files changed

+40
-14
lines changed

opengrok-indexer/src/main/java/org/opengrok/indexer/search/SearchEngine.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
import org.apache.lucene.search.IndexSearcher;
4949
import org.apache.lucene.search.Query;
5050
import org.apache.lucene.search.ScoreDoc;
51-
import org.apache.lucene.search.TopScoreDocCollector;
51+
import org.apache.lucene.search.TopScoreDocCollectorManager;
5252
import org.apache.lucene.util.Version;
5353
import org.opengrok.indexer.analysis.AbstractAnalyzer;
5454
import org.opengrok.indexer.analysis.CompatibleAnalyser;
@@ -132,7 +132,7 @@ public class SearchEngine {
132132
int cachePages = RuntimeEnvironment.getInstance().getCachePages();
133133
int totalHits = 0;
134134
private ScoreDoc[] hits;
135-
private TopScoreDocCollector collector;
135+
private TopScoreDocCollectorManager collectorManager;
136136
private IndexSearcher searcher;
137137
boolean allCollected;
138138
private final ArrayList<SuperIndexSearcher> searcherList = new ArrayList<>();
@@ -205,18 +205,20 @@ private void searchMultiDatabase(List<Project> projectList, boolean paging) thro
205205
}
206206

207207
private void searchIndex(IndexSearcher searcher, boolean paging) throws IOException {
208-
collector = TopScoreDocCollector.create(hitsPerPage * cachePages, Short.MAX_VALUE);
208+
collectorManager = new TopScoreDocCollectorManager(hitsPerPage * cachePages, Short.MAX_VALUE);
209209
Statistics stat = new Statistics();
210-
searcher.search(query, collector);
211-
totalHits = collector.getTotalHits();
210+
hits = searcher.search(query, collectorManager).scoreDocs;
211+
totalHits = searcher.count(query);
212212
stat.report(LOGGER, Level.FINEST, "search via SearchEngine done",
213213
"search.latency", new String[]{"category", "engine",
214214
"outcome", totalHits > 0 ? "success" : "empty"});
215-
if (!paging && totalHits > 0) {
216-
collector = TopScoreDocCollector.create(totalHits, Short.MAX_VALUE);
217-
searcher.search(query, collector);
215+
if (!paging && totalHits > hitsPerPage * cachePages) {
216+
collectorManager = new TopScoreDocCollectorManager(totalHits, Short.MAX_VALUE);
217+
hits = searcher.search(query, collectorManager).scoreDocs;
218+
stat.report(LOGGER, Level.FINEST, "FULL search via SearchEngine done",
219+
"search.latency", new String[]{"category", "engine",
220+
"outcome", totalHits > 0 ? "success" : "empty"});
218221
}
219-
hits = collector.topDocs().scoreDocs;
220222
StoredFields storedFields = searcher.storedFields();
221223
for (ScoreDoc hit : hits) {
222224
int docId = hit.doc;
@@ -412,14 +414,13 @@ public void results(int start, int end, List<Hit> ret) {
412414
// TODO check if below fits for if end=old hits.length, or it should include it
413415
if (end > hits.length && !allCollected) {
414416
//do the requery, we want more than 5 pages
415-
collector = TopScoreDocCollector.create(totalHits, Short.MAX_VALUE);
417+
collectorManager = new TopScoreDocCollectorManager(totalHits, Short.MAX_VALUE);
416418
try {
417-
searcher.search(query, collector);
419+
hits = searcher.search(query, collectorManager).scoreDocs;
418420
} catch (Exception e) { // this exception should never be hit, since search() will hit this before
419421
LOGGER.log(
420422
Level.WARNING, SEARCH_EXCEPTION_MSG, e);
421423
}
422-
hits = collector.topDocs().scoreDocs;
423424
StoredFields storedFields = null;
424425
try {
425426
storedFields = searcher.storedFields();

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Portions Copyright (c) 2018, 2020, Chris Fraire <[email protected]>.
6060
</scm>
6161

6262
<properties>
63-
<lucene.version>9.9.2</lucene.version>
63+
<lucene.version>9.12.3</lucene.version>
6464
<mavenjavadocplugin.version>3.6.0</mavenjavadocplugin.version>
6565
<java.version>17</java.version>
6666
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

suggester/src/main/java/org/opengrok/suggest/SuggestResultCollector.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.lucene.index.StoredFields;
2828
import org.apache.lucene.search.CollectionTerminatedException;
2929
import org.apache.lucene.search.Collector;
30+
import org.apache.lucene.search.CollectorManager;
3031
import org.apache.lucene.search.IndexSearcher;
3132
import org.apache.lucene.search.LeafCollector;
3233
import org.apache.lucene.search.Scorable;
@@ -35,6 +36,7 @@
3536
import org.opengrok.suggest.query.data.BitIntsHolder;
3637

3738
import java.io.IOException;
39+
import java.util.Collection;
3840

3941
/**
4042
* Collects Suggester query results.
@@ -62,6 +64,29 @@ public LeafCollector getLeafCollector(LeafReaderContext context) throws IOExcept
6264
return new SuggesterLeafCollector(context);
6365
}
6466

67+
/**
68+
* Creates a {@link CollectorManager} that can concurrently collect matching docs in a {@link
69+
* BitIntsHolder}.
70+
*/
71+
public static CollectorManager<SuggestResultCollector, BitIntsHolder> createManager(LeafReaderContext leafReaderContext, ComplexQueryData data,
72+
BitIntsHolder documentIds) {
73+
return new CollectorManager<>() {
74+
@Override
75+
public SuggestResultCollector newCollector() {
76+
BitIntsHolder docIds = new BitIntsHolder();
77+
return new SuggestResultCollector(leafReaderContext, data, docIds);
78+
}
79+
80+
@Override
81+
public BitIntsHolder reduce(Collection<SuggestResultCollector> collectors) {
82+
for (SuggestResultCollector collector : collectors) {
83+
documentIds.or(collector.documentIds);
84+
}
85+
return documentIds;
86+
}
87+
};
88+
}
89+
6590
/**
6691
* Indicates what features are required from the scorer.
6792
*/

suggester/src/main/java/org/opengrok/suggest/SuggesterSearcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ private ComplexQueryData getComplexQueryData(final Query query, final LeafReader
238238

239239
BitIntsHolder documentIds = new BitIntsHolder();
240240
try {
241-
search(query, new SuggestResultCollector(leafReaderContext, data, documentIds));
241+
search(query, SuggestResultCollector.createManager(leafReaderContext, data, documentIds));
242242
} catch (IOException e) {
243243
if (Thread.currentThread().isInterrupted()) {
244244
interrupted = true;

0 commit comments

Comments
 (0)