Use in-memory database if the limit is lower than 8192
This commit is contained in:
parent
a77af5253d
commit
90aa7a2522
@ -53,12 +53,14 @@ public class AdaptiveMultiSearcher implements MultiSearcher {
|
|||||||
LLSearchTransformer transformer) {
|
LLSearchTransformer transformer) {
|
||||||
// offset + limit
|
// offset + limit
|
||||||
long realLimit = queryParams.offsetLong() + queryParams.limitLong();
|
long realLimit = queryParams.offsetLong() + queryParams.limitLong();
|
||||||
|
long maxAllowedInMemoryLimit
|
||||||
|
= Math.max(MultiSearcher.MAX_IN_MEMORY_SIZE, (long) queryParams.pageLimits().getPageLimit(0));
|
||||||
|
|
||||||
return LLUtils.usingSendResource(indexSearchersMono, indexSearchers -> {
|
return LLUtils.usingSendResource(indexSearchersMono, indexSearchers -> {
|
||||||
if (queryParams.limitLong() == 0) {
|
if (queryParams.limitLong() == 0) {
|
||||||
return count.collectMulti(indexSearchersMono, queryParams, keyFieldName, transformer);
|
return count.collectMulti(indexSearchersMono, queryParams, keyFieldName, transformer);
|
||||||
} else if (queryParams.isSorted() || queryParams.needsScores()) {
|
} else if (queryParams.isSorted() || queryParams.needsScores()) {
|
||||||
if (realLimit <= (long) queryParams.pageLimits().getPageLimit(0)) {
|
if (realLimit <= maxAllowedInMemoryLimit) {
|
||||||
return scoredPaged.collectMulti(indexSearchersMono, queryParams, keyFieldName, transformer);
|
return scoredPaged.collectMulti(indexSearchersMono, queryParams, keyFieldName, transformer);
|
||||||
} else {
|
} else {
|
||||||
if ((queryParams.isSorted() && !queryParams.isSortedByScore())) {
|
if ((queryParams.isSorted() && !queryParams.isSortedByScore())) {
|
||||||
@ -67,7 +69,7 @@ public class AdaptiveMultiSearcher implements MultiSearcher {
|
|||||||
return unsortedScoredFull.collectMulti(indexSearchersMono, queryParams, keyFieldName, transformer);
|
return unsortedScoredFull.collectMulti(indexSearchersMono, queryParams, keyFieldName, transformer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (realLimit <= (long) queryParams.pageLimits().getPageLimit(0)) {
|
} else if (realLimit <= maxAllowedInMemoryLimit) {
|
||||||
// Run single-page searches using the paged multi searcher
|
// Run single-page searches using the paged multi searcher
|
||||||
return unsortedUnscoredPaged.collectMulti(indexSearchersMono, queryParams, keyFieldName, transformer);
|
return unsortedUnscoredPaged.collectMulti(indexSearchersMono, queryParams, keyFieldName, transformer);
|
||||||
} else {
|
} else {
|
||||||
|
@ -7,6 +7,11 @@ import reactor.core.publisher.Mono;
|
|||||||
|
|
||||||
public interface MultiSearcher extends LocalSearcher {
|
public interface MultiSearcher extends LocalSearcher {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use in-memory collectors if the expected results count is lower or equal than this limit
|
||||||
|
*/
|
||||||
|
int MAX_IN_MEMORY_SIZE = 8192;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param indexSearchersMono Lucene index searcher
|
* @param indexSearchersMono Lucene index searcher
|
||||||
* @param queryParams the query parameters
|
* @param queryParams the query parameters
|
||||||
|
@ -16,6 +16,7 @@ import java.io.Closeable;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ServiceLoader;
|
import java.util.ServiceLoader;
|
||||||
import org.apache.lucene.search.IndexSearcher;
|
import org.apache.lucene.search.IndexSearcher;
|
||||||
|
import org.apache.lucene.search.TopFieldCollector;
|
||||||
import org.warp.commonutils.log.Logger;
|
import org.warp.commonutils.log.Logger;
|
||||||
import org.warp.commonutils.log.LoggerFactory;
|
import org.warp.commonutils.log.LoggerFactory;
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
@ -64,6 +65,9 @@ public class SortedScoredFullMultiSearcher implements MultiSearcher {
|
|||||||
.fromCallable(() -> {
|
.fromCallable(() -> {
|
||||||
LLUtils.ensureBlocking();
|
LLUtils.ensureBlocking();
|
||||||
var totalHitsThreshold = queryParams.getTotalHitsThresholdLong();
|
var totalHitsThreshold = queryParams.getTotalHitsThresholdLong();
|
||||||
|
if (queryParams.limitLong() < MAX_IN_MEMORY_SIZE) {
|
||||||
|
throw new UnsupportedOperationException("Allowed limit is " + MAX_IN_MEMORY_SIZE + " or greater");
|
||||||
|
}
|
||||||
return LMDBFullFieldDocCollector.createSharedManager(env, queryParams.sort(), queryParams.limitInt(),
|
return LMDBFullFieldDocCollector.createSharedManager(env, queryParams.sort(), queryParams.limitInt(),
|
||||||
totalHitsThreshold);
|
totalHitsThreshold);
|
||||||
})
|
})
|
||||||
|
@ -69,6 +69,9 @@ public class UnsortedScoredFullMultiSearcher implements MultiSearcher {
|
|||||||
return Mono
|
return Mono
|
||||||
.fromCallable(() -> {
|
.fromCallable(() -> {
|
||||||
LLUtils.ensureBlocking();
|
LLUtils.ensureBlocking();
|
||||||
|
if (queryParams.limitLong() < MAX_IN_MEMORY_SIZE) {
|
||||||
|
throw new UnsupportedOperationException("Allowed limit is " + MAX_IN_MEMORY_SIZE + " or greater");
|
||||||
|
}
|
||||||
var totalHitsThreshold = queryParams.getTotalHitsThresholdLong();
|
var totalHitsThreshold = queryParams.getTotalHitsThresholdLong();
|
||||||
return LMDBFullScoreDocCollector.createSharedManager(env, queryParams.limitLong(), totalHitsThreshold);
|
return LMDBFullScoreDocCollector.createSharedManager(env, queryParams.limitLong(), totalHitsThreshold);
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user