From 1a51ec2d69e0b1c94e592ebee2b4fa02b80b551f Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Sun, 25 Feb 2024 14:01:58 +0100 Subject: [PATCH] (index) Index optimization --- .../nu/marginalia/index/IndexGrpcService.java | 30 ++++++++++------ .../index/index/IndexQueryService.java | 34 ++++++------------- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/code/index/java/nu/marginalia/index/IndexGrpcService.java b/code/index/java/nu/marginalia/index/IndexGrpcService.java index bdd2d5e4..32fe3ca0 100644 --- a/code/index/java/nu/marginalia/index/IndexGrpcService.java +++ b/code/index/java/nu/marginalia/index/IndexGrpcService.java @@ -14,7 +14,10 @@ import nu.marginalia.api.searchquery.model.results.*; import nu.marginalia.index.index.IndexQueryService; import nu.marginalia.index.index.StatefulIndex; import nu.marginalia.index.model.SearchParameters; +import nu.marginalia.index.model.SearchTerms; import nu.marginalia.index.model.SearchTermsUtil; +import nu.marginalia.index.query.IndexQuery; +import nu.marginalia.index.query.IndexSearchBudget; import nu.marginalia.index.results.IndexResultValuatorService; import nu.marginalia.index.results.model.ids.CombinedDocIdList; import nu.marginalia.index.searchset.SearchSetsService; @@ -252,8 +255,15 @@ public class IndexGrpcService extends IndexApiGrpc.IndexApiImplBase { /** Execute a search query */ public SearchResultSet run(SearchParameters parameters) throws SQLException, InterruptedException { + for (var subquery : parameters.subqueries) { - workerPool.execute(new IndexLookup(subquery, parameters)); + var terms = new SearchTerms(subquery); + if (terms.isEmpty()) + continue; + + for (var indexQuery : index.createQueries(terms, parameters.queryParams)) { + workerPool.execute(new IndexLookup(indexQuery, parameters.budget)); + } } for (int i = 0; i < indexValuationThreads; i++) { @@ -283,12 +293,13 @@ public class IndexGrpcService extends IndexApiGrpc.IndexApiImplBase { * resultCandidateQueue, which depending on the state of the valuator threads may * or may not block*/ class IndexLookup implements Runnable { - private final SearchSubquery subquery; - private final SearchParameters parameters; + private final IndexQuery query; + private final IndexSearchBudget budget; - IndexLookup(SearchSubquery subquery, SearchParameters parameters) { - this.subquery = subquery; - this.parameters = parameters; + IndexLookup(IndexQuery query, + IndexSearchBudget budget) { + this.query = query; + this.budget = budget; remainingIndexTasks.incrementAndGet(); } @@ -296,9 +307,8 @@ public class IndexGrpcService extends IndexApiGrpc.IndexApiImplBase { public void run() { try { indexQueryService.evaluateSubquery( - subquery, - parameters.queryParams, - parameters.budget, + query, + budget, this::drain ); } @@ -312,7 +322,7 @@ public class IndexGrpcService extends IndexApiGrpc.IndexApiImplBase { } private void drain(CombinedDocIdList resultIds) { - long remainingTime = parameters.budget.timeLeft(); + long remainingTime = budget.timeLeft(); try { if (!resultCandidateQueue.offer(resultIds)) { diff --git a/code/index/java/nu/marginalia/index/index/IndexQueryService.java b/code/index/java/nu/marginalia/index/index/IndexQueryService.java index f430de30..72a13910 100644 --- a/code/index/java/nu/marginalia/index/index/IndexQueryService.java +++ b/code/index/java/nu/marginalia/index/index/IndexQueryService.java @@ -16,7 +16,6 @@ import org.slf4j.LoggerFactory; import org.slf4j.Marker; import org.slf4j.MarkerFactory; -import java.util.List; import java.util.function.Consumer; @Singleton @@ -35,36 +34,25 @@ public class IndexQueryService { * at different priorty depths until timeout is reached or the results are all visited. * Then the results are combined. * */ - public void evaluateSubquery(SearchSubquery subquery, - QueryParams queryParams, + public void evaluateSubquery(IndexQuery query, IndexSearchBudget timeout, Consumer drain) { - final SearchTerms searchTerms = new SearchTerms(subquery); - final Roaring64Bitmap results = new Roaring64Bitmap(); + final LongArrayList results = new LongArrayList(512); // These queries are different indices for one subquery - List queries = index.createQueries(searchTerms, queryParams); - for (var query : queries) { + final LongQueryBuffer buffer = new LongQueryBuffer(512); - if (!timeout.hasTimeLeft()) - break; + while (query.hasMore() && timeout.hasTimeLeft()) + { + buffer.reset(); + query.getMoreResults(buffer); - final LongQueryBuffer buffer = new LongQueryBuffer(512); + results.addElements(0, buffer.data, 0, buffer.end); - while (query.hasMore() && timeout.hasTimeLeft()) - { - buffer.reset(); - query.getMoreResults(buffer); - - for (int i = 0; i < buffer.size(); i++) { - results.add(buffer.data[i]); - } - - if (results.getIntCardinality() > 512) { - drain.accept(new CombinedDocIdList(results)); - results.clear(); - } + if (results.size() < 512) { + drain.accept(new CombinedDocIdList(results)); + results.clear(); } }