This is an automated email from the ASF dual-hosted git repository. dsmiley pushed a commit to branch branch_10x in repository https://gitbox.apache.org/repos/asf/solr.git
commit f24dd94794619f7ab991dda7124427708c285d2c Author: Sonu Sharma <[email protected]> AuthorDate: Sat Jun 6 09:26:03 2026 +0530 SOLR-18271: QueryElevation support for Combined Query feature (#4476) Adds QueryElevationComponent support to the Combined Query feature, so that elevated docIds (via elevateIds / configured elevations) are honored when results from multiple subqueries are combined and merged across shards. --- .../SOLR-18271-query-elevation-combined-query.yml | 8 +++ .../handler/component/CombinedQueryComponent.java | 1 + .../handler/component/QueryElevationComponent.java | 42 ++++++++++- .../collection1/conf/solrconfig-combined-query.xml | 15 +++- .../component/CombinedQuerySolrCloudTest.java | 83 +++++++++++++++++----- .../DistributedCombinedQueryComponentTest.java | 74 +++++++++++++++---- 6 files changed, 190 insertions(+), 33 deletions(-) diff --git a/changelog/unreleased/SOLR-18271-query-elevation-combined-query.yml b/changelog/unreleased/SOLR-18271-query-elevation-combined-query.yml new file mode 100644 index 00000000000..a2acaa2e623 --- /dev/null +++ b/changelog/unreleased/SOLR-18271-query-elevation-combined-query.yml @@ -0,0 +1,8 @@ +title: Support for using Query Elevation with CombinedQueryComponent (RRF) +type: added +authors: + - name: Sonu Sharma + nick: ercsonusharma +links: + - name: SOLR-18271 + url: https://issues.apache.org/jira/browse/SOLR-18271 diff --git a/solr/core/src/java/org/apache/solr/handler/component/CombinedQueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/CombinedQueryComponent.java index 8b097bc304d..1e5c0b11aa1 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/CombinedQueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/CombinedQueryComponent.java @@ -151,6 +151,7 @@ public class CombinedQueryComponent extends QueryComponent implements SolrCoreAw final var unparsedQuery = params.get(queryKey); ResponseBuilder rbNew = new ResponseBuilder(rb.req, new SolrQueryResponse(), rb.components); rbNew.setQueryString(unparsedQuery); + rbNew.setDebug(rb.isDebug()); super.prepare(rbNew); crb.setFilters(rbNew.getFilters()); crb.responseBuilders.add(rbNew); diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java index 2bc9ae3d0bb..7e079b95882 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java @@ -112,6 +112,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore @VisibleForTesting static final String FIELD_TYPE = "queryFieldType"; @VisibleForTesting static final String CONFIG_FILE = "config-file"; private static final String EXCLUDE = "exclude"; + private static final String DEBUG_QUERY_BOOSTING = "queryBoosting"; /** * @see #getBoostDocs(SolrIndexSearcher, Set, Map) @@ -488,6 +489,45 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore return; } + if (rb instanceof CombinedQueryResponseBuilder crb) { + prepareCombined(crb); + } else { + prepareElevationComponent(rb); + } + } + + /** + * Elevates each subquery and mirrors the resulting SortSpec/filters onto the parent crb so {@link + * CombinedQueryComponent#mergeIds} can read {@code _elevate_} from each shard's {@code + * sort_values_i} during distributed merge. + */ + private void prepareCombined(CombinedQueryResponseBuilder crb) throws IOException { + if (crb.responseBuilders.isEmpty()) { + return; + } + for (ResponseBuilder thisRb : crb.responseBuilders) { + prepareElevationComponent(thisRb); + } + // Subqueries get identical elevation treatment, so any one is representative. + ResponseBuilder representative = crb.responseBuilders.getFirst(); + crb.setSortSpec(representative.getSortSpec()); + crb.setFilters(representative.getFilters()); + + if (crb.isDebug() && crb.isDebugQuery()) { + List<Object> debugPerSubquery = new ArrayList<>(crb.responseBuilders.size()); + for (ResponseBuilder thisRb : crb.responseBuilders) { + Object queryBoosting = thisRb.getDebugInfo().get(DEBUG_QUERY_BOOSTING); + if (queryBoosting != null) { + debugPerSubquery.add(queryBoosting); + } + } + if (!debugPerSubquery.isEmpty()) { + crb.addDebugInfo(DEBUG_QUERY_BOOSTING, debugPerSubquery); + } + } + } + + private void prepareElevationComponent(ResponseBuilder rb) throws IOException { Elevation elevation = getElevation(rb); if (elevation != null) { setQuery(rb, elevation); @@ -767,7 +807,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore SimpleOrderedMap<Object> dbg = new SimpleOrderedMap<>(); dbg.add("q", rb.getQueryString()); dbg.add("match", match); - rb.addDebugInfo("queryBoosting", dbg); + rb.addDebugInfo(DEBUG_QUERY_BOOSTING, dbg); } // --------------------------------------------------------------------------------- diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-combined-query.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-combined-query.xml index b96ff9cd687..35908f42195 100644 --- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-combined-query.xml +++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-combined-query.xml @@ -98,7 +98,18 @@ <requestHandler name="/search" class="solr.CombinedQuerySearchHandler"> </requestHandler> - <searchComponent class="solr.CombinedQueryComponent" name="combined_query"> + <requestHandler name="/search-elevate" class="solr.CombinedQuerySearchHandler"> + <arr name="last-components"> + <str>elevator</str> + </arr> + </requestHandler> + + <searchComponent name="elevator" class="solr.QueryElevationComponent">> + <str name="queryFieldType">string</str> + <str name="config-file">elevate.xml</str> + </searchComponent> + + <searchComponent class="solr.CombinedQueryComponent" name="combined_query"> <int name="maxCombinerQueries">2</int> <lst name="combiners"> <lst name="test"> @@ -159,7 +170,7 @@ </highlighting> </searchComponent> - <initParams path="/select,/search"> + <initParams path="/select,/search,/search-elevate"> <lst name="defaults"> <str name="df">text</str> </lst> diff --git a/solr/core/src/test/org/apache/solr/handler/component/CombinedQuerySolrCloudTest.java b/solr/core/src/test/org/apache/solr/handler/component/CombinedQuerySolrCloudTest.java index 4f5f31d8006..39a7e69e23f 100644 --- a/solr/core/src/test/org/apache/solr/handler/component/CombinedQuerySolrCloudTest.java +++ b/solr/core/src/test/org/apache/solr/handler/component/CombinedQuerySolrCloudTest.java @@ -16,12 +16,15 @@ */ package org.apache.solr.handler.component; +import static org.apache.solr.cloud.AbstractZkTestCase.SOLRHOME; + import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.cloud.AbstractFullDistribZkTestBase; +import org.apache.solr.cloud.ZkTestServer; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ShardParams; @@ -49,6 +52,12 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { configString = "solrconfig-combined-query.xml"; } + @Override + public void distribSetUp() throws Exception { + super.distribSetUp(); + ZkTestServer.putConfig("conf1", zkServer.getZkClient(), SOLRHOME, "elevate.xml"); + } + @Override protected String getCloudSchemaFile() { return "schema-vector-catchall.xml"; @@ -121,7 +130,7 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { query( CommonParams.JSON, "{\"queries\":" - + "{\"lexical1\":{\"lucene\":{\"query\":\"id:2^10\"}}}," + + "{\"lexical1\":{\"lucene\":{\"query\":\"id:2^=10\"}}}," + "\"limit\":5," + "\"fields\":[\"id\",\"score\",\"title\"]," + "\"params\":{\"combiner\":true,\"combiner.query\":[\"lexical1\"]}}", @@ -141,8 +150,8 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { prepareIndexDocs(); String jsonQuery = "{\"queries\":" - + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^2 OR 3^1 OR 6^2 OR 5^1)\"}}," - + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^1 OR 5^2 OR 7^3 OR 10^2)\"}}}," + + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)\"}}," + + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^=1 OR 5^=3 OR 7^=4 OR 10^=2)\"}}}," + "\"limit\":5," + "\"fields\":[\"id\",\"score\",\"title\"]," + "\"params\":{\"combiner\":true,\"combiner.query\":[\"lexical1\",\"lexical2\"]}}"; @@ -161,8 +170,8 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { prepareIndexDocs(); String jsonQuery = "{\"queries\":" - + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^2 OR 3^1 OR 6^2 OR 5^1)\"}}," - + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^1 OR 5^2 OR 7^3 OR 10^1)\"}}}," + + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)\"}}," + + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^=1 OR 5^=3 OR 7^=4 OR 10^=2)\"}}}," + "\"limit\":5,\"sort\":\"mod3_idv desc, score desc\"" + "\"fields\":[\"id\",\"score\",\"title\"]," + "\"params\":{\"combiner\":true,\"combiner.query\":[\"lexical1\",\"lexical2\"]}}"; @@ -183,8 +192,8 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { query( CommonParams.JSON, "{\"queries\":" - + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^2 OR 3^1 OR 6^2 OR 5^1)\"}}," - + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^1 OR 5^2 OR 7^3 OR 10^2)\"}}}," + + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)\"}}," + + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^=1 OR 5^=3 OR 7^=4 OR 10^=2)\"}}}," + "\"fields\":[\"id\",\"score\",\"title\"]," + "\"params\":{\"combiner\":true,\"combiner.query\":[\"lexical1\",\"lexical2\"]}}", CommonParams.QT, @@ -194,8 +203,8 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { query( CommonParams.JSON, "{\"queries\":" - + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^2 OR 3^1 OR 6^2 OR 5^1)\"}}," - + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^1 OR 5^2 OR 7^3 OR 10^2)\"}}}," + + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)\"}}," + + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^=1 OR 5^=3 OR 7^=4 OR 10^=2)\"}}}," + "\"limit\":4," + "\"fields\":[\"id\",\"score\",\"title\"]," + "\"params\":{\"combiner\":true,\"combiner.query\":[\"lexical1\",\"lexical2\"]}}", @@ -206,8 +215,8 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { query( CommonParams.JSON, "{\"queries\":" - + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^2 OR 3^1 OR 6^2 OR 5^1)\"}}," - + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^1 OR 5^2 OR 7^3 OR 10^2)\"}}}," + + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)\"}}," + + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^=1 OR 5^=3 OR 7^=4 OR 10^=2)\"}}}," + "\"limit\":4,\"offset\":3," + "\"fields\":[\"id\",\"score\",\"title\"]," + "\"params\":{\"combiner\":true,\"combiner.query\":[\"lexical1\",\"lexical2\"]}}", @@ -227,7 +236,7 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { prepareIndexDocs(); String jsonQuery = "{\"queries\":" - + "{\"lexical\":{\"lucene\":{\"query\":\"id:(2^2 OR 3^1 OR 6^2 OR 5^1)\"}}}," + + "{\"lexical\":{\"lucene\":{\"query\":\"id:(2^=2 OR 3^=1 OR 6^=2 OR 5^=1)\"}}}," + "\"limit\":3,\"offset\":1" + "\"fields\":[\"id\",\"score\",\"title\"]," + "\"params\":{\"combiner\":true,\"facet\":true,\"facet.field\":\"mod3_idv\",\"facet.mincount\":1," @@ -248,8 +257,8 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { prepareIndexDocs(); String jsonQuery = "{\"queries\":" - + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^2 OR 3^1 OR 6^2 OR 5^1)\"}}," - + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^1 OR 5^2 OR 7^3 OR 10^2)\"}}}," + + "{\"lexical1\":{\"lucene\":{\"query\":\"id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)\"}}," + + "\"lexical2\":{\"lucene\":{\"query\":\"id:(8^=1 OR 5^=3 OR 7^=4 OR 10^=2)\"}}}," + "\"limit\":4," + "\"fields\":[\"id\",\"score\",\"title\"]," + "\"params\":{\"combiner\":true,\"facet\":true,\"facet.field\":\"mod3_idv\"," @@ -269,6 +278,48 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { rsp.getHighlighting().get("5").get("title").getFirst()); } + /** + * Tests the combined query feature with faceting, highlighting and elevation. + * + * @throws Exception if any unexpected error occurs during the test execution. + */ + @Test + public void testElevatedQueriesWithFacetAndHighlights() throws Exception { + prepareIndexDocs(); + String jsonQuery = + """ + { + "queries": { + "lexical1": {"lucene": {"query": "id:(2^=3 OR 3^=1 OR 6^=2 OR 5^=2)"}}, + "lexical2": {"lucene": {"query": "id:(4^=1 OR 5^=2 OR 7^=3 OR 10^=2)"}} + }, + "limit": 4, + "fields": ["id", "score", "title"], + "params": { + "combiner": true, + "elevateIds": "6,10", + "combiner.query": ["lexical1", "lexical2"], + "facet": true, + "facet.field": "mod3_idv", + "hl": true, + "hl.fl": "title", + "hl.q": "test doc" + } + }"""; + QueryResponse rsp = query(CommonParams.JSON, jsonQuery, CommonParams.QT, "/search-elevate"); + assertEquals(4, rsp.getResults().size()); + assertFieldValues(rsp.getResults(), id, "6", "10", "5", "7"); + assertEquals("mod3_idv", rsp.getFacetFields().getFirst().getName()); + assertEquals("[1 (3), 0 (2), 2 (2)]", rsp.getFacetFields().getFirst().getValues().toString()); + assertEquals(4, rsp.getHighlighting().size()); + assertEquals( + "title <em>test</em> for <em>doc</em> 10", + rsp.getHighlighting().get("10").get("title").getFirst()); + assertEquals( + "title <em>test</em> for <em>doc</em> 5", + rsp.getHighlighting().get("5").get("title").getFirst()); + } + /** * Tests the combined query feature with faceting, highlighting and collapse. * @@ -284,12 +335,12 @@ public class CombinedQuerySolrCloudTest extends AbstractFullDistribZkTestBase { "queries": { "lexical1": { "lucene": { - "query": "id:(CO!2^3 OR CO!3^1 OR CO!6^2 OR CO!5^1)" + "query": "id:(CO!2^=3 OR CO!3^=1 OR CO!6^=2 OR CO!5^=1)" } }, "lexical2": { "lucene": { - "query": "id:(CO!8^1 OR CO!5^2 OR CO!7^3 OR CO!10^2)" + "query": "id:(CO!8^=1 OR CO!5^=2 OR CO!7^=3 OR CO!10^=2)" } } }, diff --git a/solr/core/src/test/org/apache/solr/handler/component/DistributedCombinedQueryComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/DistributedCombinedQueryComponentTest.java index f4e4572ec7c..28fe45eaa07 100644 --- a/solr/core/src/test/org/apache/solr/handler/component/DistributedCombinedQueryComponentTest.java +++ b/solr/core/src/test/org/apache/solr/handler/component/DistributedCombinedQueryComponentTest.java @@ -122,7 +122,7 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch """ { "queries": { - "lexical1": {"lucene": {"query": "id:2^10"}} + "lexical1": {"lucene": {"query": "id:2^=10"}} }, "limit": 5, "fields": ["id", "score", "title"], @@ -158,8 +158,8 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch """ { "queries": { - "lexical1": {"lucene": {"query": "id:(2^2 OR 3^1 OR 6^2 OR 5^1)"}}, - "lexical2": {"lucene": {"query": "id:(4^1 OR 5^2 OR 7^3 OR 10^2)"}} + "lexical1": {"lucene": {"query": "id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)"}}, + "lexical2": {"lucene": {"query": "id:(4^=1 OR 5^=3 OR 7^=4 OR 10^=2)"}} }, "limit": 5, "fields": ["id", "score", "title"], @@ -183,8 +183,8 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch """ { "queries": { - "lexical1": {"lucene": {"query": "id:(2^2 OR 3^1 OR 6^2 OR 5^1)"}}, - "lexical2": {"lucene": {"query": "id:(4^1 OR 5^2 OR 7^3 OR 10^2)"}} + "lexical1": {"lucene": {"query": "id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)"}}, + "lexical2": {"lucene": {"query": "id:(4^=1 OR 5^=3 OR 7^=4 OR 10^=2)"}} }, "limit": 5, "sort": "mod3_idv desc, score desc", @@ -209,8 +209,8 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch """ { "queries": { - "lexical1": {"lucene": {"query": "id:(2^2 OR 3^1 OR 6^2 OR 5^1)"}}, - "lexical2": {"lucene": {"query": "id:(4^1 OR 5^2 OR 7^3 OR 10^2)"}} + "lexical1": {"lucene": {"query": "id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)"}}, + "lexical2": {"lucene": {"query": "id:(4^=1 OR 5^=3 OR 7^=4 OR 10^=2)"}} }, "fields": ["id", "score", "title"], "params": {"combiner": true, "combiner.query": ["lexical1", "lexical2"]} @@ -221,8 +221,8 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch """ { "queries": { - "lexical1": {"lucene": {"query": "id:(2^2 OR 3^1 OR 6^2 OR 5^1)"}}, - "lexical2": {"lucene": {"query": "id:(4^1 OR 5^2 OR 7^3 OR 10^2)"}} + "lexical1": {"lucene": {"query": "id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)"}}, + "lexical2": {"lucene": {"query": "id:(4^=1 OR 5^=3 OR 7^=4 OR 10^=2)"}} }, "limit": 4, "fields": ["id", "score", "title"], @@ -234,8 +234,8 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch """ { "queries": { - "lexical1": {"lucene": {"query": "id:(2^2 OR 3^1 OR 6^2 OR 5^1)"}}, - "lexical2": {"lucene": {"query": "id:(4^1 OR 5^2 OR 7^3 OR 10^2)"}} + "lexical1": {"lucene": {"query": "id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)"}}, + "lexical2": {"lucene": {"query": "id:(4^=1 OR 5^=3 OR 7^=4 OR 10^=2)"}} }, "limit": 4, "offset": 3, @@ -260,7 +260,7 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch """ { "queries": { - "lexical": {"lucene": {"query": "id:(2^2 OR 3^1 OR 6^2 OR 5^1)"}} + "lexical": {"lucene": {"query": "id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)"}} }, "limit": 3, "offset": 1, @@ -292,8 +292,8 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch """ { "queries": { - "lexical1": {"lucene": {"query": "id:(2^2 OR 3^1 OR 6^2 OR 5^1)"}}, - "lexical2": {"lucene": {"query": "id:(4^1 OR 5^2 OR 7^3 OR 10^2)"}} + "lexical1": {"lucene": {"query": "id:(2^=4 OR 3^=2 OR 6^=3 OR 5^=1)"}}, + "lexical2": {"lucene": {"query": "id:(4^=1 OR 5^=3 OR 7^=4 OR 10^=2)"}} }, "limit": 4, "fields": ["id", "score", "title"], @@ -321,6 +321,52 @@ public class DistributedCombinedQueryComponentTest extends BaseDistributedSearch rsp.getHighlighting().get("5").get("title").getFirst()); } + /** + * Tests the combined query feature with faceting, highlighting and elevation with debug. + * + * @throws Exception if any unexpected error occurs during the test execution. + */ + @Test + public void testElevatedQueriesWithFacetAndHighlights() throws Exception { + prepareIndexDocs(); + String jsonQuery = + """ + { + "queries": { + "lexical1": {"lucene": {"query": "id:(2^=2 OR 3^=1 OR 6^=2 OR 1^=3)"}}, + "lexical2": {"lucene": {"query": "id:(4^=1 OR 1^=2 OR 7^=3 OR 10^=2)"}} + }, + "limit": 4, + "fields": ["id", "score", "title"], + "params": { + "combiner": true, + "elevateIds": "10,6", + "combiner.query": ["lexical1", "lexical2"], + "facet": true, + "facet.field": "mod3_idv", + "hl": true, + "hl.fl": "title", + "hl.q": "test doc", + "debug": "true" + } + }"""; + handle.put("debug", SKIP); + QueryResponse rsp = query(CommonParams.JSON, jsonQuery, CommonParams.QT, "/search-elevate"); + assertEquals(4, rsp.getResults().size()); + assertFieldValues(rsp.getResults(), id, "10", "6", "1", "7"); + assertEquals("mod3_idv", rsp.getFacetFields().getFirst().getName()); + assertEquals("[1 (4), 0 (2), 2 (1)]", rsp.getFacetFields().getFirst().getValues().toString()); + assertEquals(4, rsp.getHighlighting().size()); + assertEquals( + "title <em>test</em> for <em>doc</em> 1", + rsp.getHighlighting().get("1").get("title").getFirst()); + assertEquals( + "title <em>test</em> for <em>doc</em> 6", + rsp.getHighlighting().get("6").get("title").getFirst()); + assertTrue(rsp.getDebugMap().containsKey("queryBoosting")); + assertEquals(2, ((List<?>) rsp.getDebugMap().get("queryBoosting")).size()); + } + /** * @see org.apache.solr.handler.component.CombinedQuerySolrCloudTest#testForcedDistrib() */
