mirror of https://github.com/apache/lucene.git
SOLR-3369: shards.tolerant=true is broken for group queries
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1498992 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f38c5163cc
commit
b7203642fe
|
@ -237,6 +237,9 @@ Bug Fixes
|
||||||
* SOLR-4974: Outgrowth of SOLR-4960 that includes transient cores and pending cores
|
* SOLR-4974: Outgrowth of SOLR-4960 that includes transient cores and pending cores
|
||||||
(Erick Erickson)
|
(Erick Erickson)
|
||||||
|
|
||||||
|
* SOLR-3369: shards.tolerant=true is broken for group queries
|
||||||
|
(Russell Black, Martijn van Groningen, Jabouille jean Charles, Ryan McKinley via shalin)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,11 @@ package org.apache.solr.search.grouping.distributed.responseprocessor;
|
||||||
import org.apache.lucene.search.Sort;
|
import org.apache.lucene.search.Sort;
|
||||||
import org.apache.lucene.search.grouping.SearchGroup;
|
import org.apache.lucene.search.grouping.SearchGroup;
|
||||||
import org.apache.lucene.util.BytesRef;
|
import org.apache.lucene.util.BytesRef;
|
||||||
|
import org.apache.solr.client.solrj.SolrServerException;
|
||||||
import org.apache.solr.common.SolrException;
|
import org.apache.solr.common.SolrException;
|
||||||
|
import org.apache.solr.common.params.ShardParams;
|
||||||
import org.apache.solr.common.util.NamedList;
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.common.util.SimpleOrderedMap;
|
||||||
import org.apache.solr.handler.component.ResponseBuilder;
|
import org.apache.solr.handler.component.ResponseBuilder;
|
||||||
import org.apache.solr.handler.component.ShardRequest;
|
import org.apache.solr.handler.component.ShardRequest;
|
||||||
import org.apache.solr.handler.component.ShardResponse;
|
import org.apache.solr.handler.component.ShardResponse;
|
||||||
|
@ -31,6 +34,8 @@ import org.apache.solr.search.grouping.distributed.command.Pair;
|
||||||
import org.apache.solr.search.grouping.distributed.shardresultserializer.SearchGroupsResultTransformer;
|
import org.apache.solr.search.grouping.distributed.shardresultserializer.SearchGroupsResultTransformer;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -61,7 +66,38 @@ public class SearchGroupShardResponseProcessor implements ShardResponseProcessor
|
||||||
try {
|
try {
|
||||||
int maxElapsedTime = 0;
|
int maxElapsedTime = 0;
|
||||||
int hitCountDuringFirstPhase = 0;
|
int hitCountDuringFirstPhase = 0;
|
||||||
|
|
||||||
|
NamedList<Object> shardInfo = null;
|
||||||
|
if (rb.req.getParams().getBool(ShardParams.SHARDS_INFO, false)) {
|
||||||
|
shardInfo = new SimpleOrderedMap<Object>();
|
||||||
|
rb.rsp.getValues().add(ShardParams.SHARDS_INFO + ".firstPhase", shardInfo);
|
||||||
|
}
|
||||||
|
|
||||||
for (ShardResponse srsp : shardRequest.responses) {
|
for (ShardResponse srsp : shardRequest.responses) {
|
||||||
|
if (shardInfo != null) {
|
||||||
|
SimpleOrderedMap<Object> nl = new SimpleOrderedMap<Object>();
|
||||||
|
|
||||||
|
if (srsp.getException() != null) {
|
||||||
|
Throwable t = srsp.getException();
|
||||||
|
if (t instanceof SolrServerException) {
|
||||||
|
t = ((SolrServerException) t).getCause();
|
||||||
|
}
|
||||||
|
nl.add("error", t.toString());
|
||||||
|
StringWriter trace = new StringWriter();
|
||||||
|
t.printStackTrace(new PrintWriter(trace));
|
||||||
|
nl.add("trace", trace.toString());
|
||||||
|
} else {
|
||||||
|
nl.add("numFound", (Integer) srsp.getSolrResponse().getResponse().get("totalHitCount"));
|
||||||
|
}
|
||||||
|
if (srsp.getSolrResponse() != null) {
|
||||||
|
nl.add("time", srsp.getSolrResponse().getElapsedTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
shardInfo.add(srsp.getShard(), nl);
|
||||||
|
}
|
||||||
|
if (rb.req.getParams().getBool(ShardParams.SHARDS_TOLERANT, false) && srsp.getException() != null) {
|
||||||
|
continue; // continue if there was an error and we're tolerant.
|
||||||
|
}
|
||||||
maxElapsedTime = (int) Math.max(maxElapsedTime, srsp.getSolrResponse().getElapsedTime());
|
maxElapsedTime = (int) Math.max(maxElapsedTime, srsp.getSolrResponse().getElapsedTime());
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
NamedList<NamedList> firstPhaseResult = (NamedList<NamedList>) srsp.getSolrResponse().getResponse().get("firstPhase");
|
NamedList<NamedList> firstPhaseResult = (NamedList<NamedList>) srsp.getSolrResponse().getResponse().get("firstPhase");
|
||||||
|
|
|
@ -23,8 +23,11 @@ import org.apache.lucene.search.TopDocs;
|
||||||
import org.apache.lucene.search.grouping.GroupDocs;
|
import org.apache.lucene.search.grouping.GroupDocs;
|
||||||
import org.apache.lucene.search.grouping.TopGroups;
|
import org.apache.lucene.search.grouping.TopGroups;
|
||||||
import org.apache.lucene.util.BytesRef;
|
import org.apache.lucene.util.BytesRef;
|
||||||
|
import org.apache.solr.client.solrj.SolrServerException;
|
||||||
import org.apache.solr.common.SolrException;
|
import org.apache.solr.common.SolrException;
|
||||||
|
import org.apache.solr.common.params.ShardParams;
|
||||||
import org.apache.solr.common.util.NamedList;
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.common.util.SimpleOrderedMap;
|
||||||
import org.apache.solr.handler.component.ResponseBuilder;
|
import org.apache.solr.handler.component.ResponseBuilder;
|
||||||
import org.apache.solr.handler.component.ShardDoc;
|
import org.apache.solr.handler.component.ShardDoc;
|
||||||
import org.apache.solr.handler.component.ShardRequest;
|
import org.apache.solr.handler.component.ShardRequest;
|
||||||
|
@ -35,6 +38,8 @@ import org.apache.solr.search.grouping.distributed.command.QueryCommandResult;
|
||||||
import org.apache.solr.search.grouping.distributed.shardresultserializer.TopGroupsResultTransformer;
|
import org.apache.solr.search.grouping.distributed.shardresultserializer.TopGroupsResultTransformer;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -76,18 +81,66 @@ public class TopGroupsShardResponseProcessor implements ShardResponseProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
TopGroupsResultTransformer serializer = new TopGroupsResultTransformer(rb);
|
TopGroupsResultTransformer serializer = new TopGroupsResultTransformer(rb);
|
||||||
|
|
||||||
|
NamedList<Object> shardInfo = null;
|
||||||
|
if (rb.req.getParams().getBool(ShardParams.SHARDS_INFO, false)) {
|
||||||
|
shardInfo = new SimpleOrderedMap<Object>();
|
||||||
|
rb.rsp.getValues().add(ShardParams.SHARDS_INFO, shardInfo);
|
||||||
|
}
|
||||||
|
|
||||||
for (ShardResponse srsp : shardRequest.responses) {
|
for (ShardResponse srsp : shardRequest.responses) {
|
||||||
|
SimpleOrderedMap<Object> individualShardInfo = null;
|
||||||
|
if (shardInfo != null) {
|
||||||
|
individualShardInfo = new SimpleOrderedMap<Object>();
|
||||||
|
|
||||||
|
if (srsp.getException() != null) {
|
||||||
|
Throwable t = srsp.getException();
|
||||||
|
if (t instanceof SolrServerException) {
|
||||||
|
t = ((SolrServerException) t).getCause();
|
||||||
|
}
|
||||||
|
individualShardInfo.add("error", t.toString());
|
||||||
|
StringWriter trace = new StringWriter();
|
||||||
|
t.printStackTrace(new PrintWriter(trace));
|
||||||
|
individualShardInfo.add("trace", trace.toString());
|
||||||
|
} else {
|
||||||
|
// summary for successful shard response is added down below
|
||||||
|
}
|
||||||
|
if (srsp.getSolrResponse() != null) {
|
||||||
|
individualShardInfo.add("time", srsp.getSolrResponse().getElapsedTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
shardInfo.add(srsp.getShard(), individualShardInfo);
|
||||||
|
}
|
||||||
|
if (rb.req.getParams().getBool(ShardParams.SHARDS_TOLERANT, false) && srsp.getException() != null) {
|
||||||
|
continue; // continue if there was an error and we're tolerant.
|
||||||
|
}
|
||||||
NamedList<NamedList> secondPhaseResult = (NamedList<NamedList>) srsp.getSolrResponse().getResponse().get("secondPhase");
|
NamedList<NamedList> secondPhaseResult = (NamedList<NamedList>) srsp.getSolrResponse().getResponse().get("secondPhase");
|
||||||
Map<String, ?> result = serializer.transformToNative(secondPhaseResult, groupSort, sortWithinGroup, srsp.getShard());
|
Map<String, ?> result = serializer.transformToNative(secondPhaseResult, groupSort, sortWithinGroup, srsp.getShard());
|
||||||
|
int numFound = 0;
|
||||||
|
float maxScore = Float.NaN;
|
||||||
for (String field : commandTopGroups.keySet()) {
|
for (String field : commandTopGroups.keySet()) {
|
||||||
TopGroups<BytesRef> topGroups = (TopGroups<BytesRef>) result.get(field);
|
TopGroups<BytesRef> topGroups = (TopGroups<BytesRef>) result.get(field);
|
||||||
if (topGroups == null) {
|
if (topGroups == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (individualShardInfo != null) { // keep track of this when shards.info=true
|
||||||
|
numFound += topGroups.totalHitCount;
|
||||||
|
if (Float.isNaN(maxScore) || topGroups.maxScore > maxScore) maxScore = topGroups.maxScore;
|
||||||
|
}
|
||||||
commandTopGroups.get(field).add(topGroups);
|
commandTopGroups.get(field).add(topGroups);
|
||||||
}
|
}
|
||||||
for (String query : queries) {
|
for (String query : queries) {
|
||||||
commandTopDocs.get(query).add((QueryCommandResult) result.get(query));
|
QueryCommandResult queryCommandResult = (QueryCommandResult) result.get(query);
|
||||||
|
if (individualShardInfo != null) { // keep track of this when shards.info=true
|
||||||
|
numFound += queryCommandResult.getMatches();
|
||||||
|
float thisMax = queryCommandResult.getTopDocs().getMaxScore();
|
||||||
|
if (Float.isNaN(maxScore) || thisMax > maxScore) maxScore = thisMax;
|
||||||
|
}
|
||||||
|
commandTopDocs.get(query).add(queryCommandResult);
|
||||||
|
}
|
||||||
|
if (individualShardInfo != null) { // when shards.info=true
|
||||||
|
individualShardInfo.add("numFound", numFound);
|
||||||
|
individualShardInfo.add("maxScore", maxScore);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -360,6 +360,26 @@ public class TestDistributedSearch extends BaseDistributedSearchTestCase {
|
||||||
ShardParams.SHARDS_INFO,"true",
|
ShardParams.SHARDS_INFO,"true",
|
||||||
ShardParams.SHARDS_TOLERANT,"true");
|
ShardParams.SHARDS_TOLERANT,"true");
|
||||||
|
|
||||||
|
queryPartialResults(upShards, upClients,
|
||||||
|
"q", "*:*",
|
||||||
|
"facet", "true",
|
||||||
|
"facet.query", i1 + ":[1 TO 50]",
|
||||||
|
ShardParams.SHARDS_INFO, "true",
|
||||||
|
ShardParams.SHARDS_TOLERANT, "true");
|
||||||
|
|
||||||
|
// test group query
|
||||||
|
queryPartialResults(upShards, upClients,
|
||||||
|
"q", "*:*",
|
||||||
|
"rows", 100,
|
||||||
|
"fl", "id," + i1,
|
||||||
|
"group", "true",
|
||||||
|
"group.query", t1 + ":kings OR " + t1 + ":eggs",
|
||||||
|
"group.limit", 10,
|
||||||
|
"sort", i1 + " asc, id asc",
|
||||||
|
CommonParams.TIME_ALLOWED, 1,
|
||||||
|
ShardParams.SHARDS_INFO, "true",
|
||||||
|
ShardParams.SHARDS_TOLERANT, "true");
|
||||||
|
|
||||||
// restart the jettys
|
// restart the jettys
|
||||||
for (JettySolrRunner downJetty : downJettys) {
|
for (JettySolrRunner downJetty : downJettys) {
|
||||||
downJetty.start();
|
downJetty.start();
|
||||||
|
|
Loading…
Reference in New Issue