SOLR-1471: fix single value case for missing fields

git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@821014 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Grant Ingersoll 2009-10-02 13:31:17 +00:00
parent 014c0a392e
commit 9b7cf7819f
4 changed files with 86 additions and 38 deletions

View File

@ -594,6 +594,10 @@ Bug Fixes
68. SOLR-1468: SolrJ's XML response parsing threw an exception for null 68. SOLR-1468: SolrJ's XML response parsing threw an exception for null
names, such as those produced when facet.missing=true (yonik) names, such as those produced when facet.missing=true (yonik)
69. SOLR-1471: Fixed issue with calculating missing values for facets in single valued cases in Stats Component.
This is not correctly calculated for the multivalued case. (James Miller, gsingers)
Other Changes Other Changes
---------------------- ----------------------
1. Upgraded to Lucene 2.4.0 (yonik) 1. Upgraded to Lucene 2.4.0 (yonik)

View File

@ -82,8 +82,6 @@ public class FieldFacetStats {
public boolean facet(int docID, Double v) { public boolean facet(int docID, Double v) {
if (v == null) return false;
int term = termNum[docID]; int term = termNum[docID];
int arrIdx = term - startTermIndex; int arrIdx = term - startTermIndex;
if (arrIdx >= 0 && arrIdx < nTerms) { if (arrIdx >= 0 && arrIdx < nTerms) {
@ -93,7 +91,12 @@ public class FieldFacetStats {
stats = new StatsValues(); stats = new StatsValues();
facetStatsValues.put(key, stats); facetStatsValues.put(key, stats);
} }
stats.accumulate(v); if (v != null) {
stats.accumulate(v);
} else {
stats.missing++;
return false;
}
return true; return true;
} }
return false; return false;

View File

@ -634,33 +634,33 @@ public class UnInvertedField {
//functionality between the two and refactor code somewhat //functionality between the two and refactor code somewhat
use.incrementAndGet(); use.incrementAndGet();
FieldType ft = searcher.getSchema().getFieldType(field);
StatsValues allstats = new StatsValues(); StatsValues allstats = new StatsValues();
int i = 0;
final FieldFacetStats[] finfo = new FieldFacetStats[facet.length];
//Initialize facetstats, if facets have been passed in
FieldCache.StringIndex si;
for (String f : facet) {
ft = searcher.getSchema().getFieldType(f);
try {
si = FieldCache.DEFAULT.getStringIndex(searcher.getReader(), f);
}
catch (IOException e) {
throw new RuntimeException("failed to open field cache for: " + f, e);
}
finfo[i++] = new FieldFacetStats(f, si, ft, numTermsInField);
}
DocSet docs = baseDocs; DocSet docs = baseDocs;
int baseSize = docs.size(); int baseSize = docs.size();
int maxDoc = searcher.maxDoc(); int maxDoc = searcher.maxDoc();
if (baseSize > 0) { if (baseSize > 0) {
FieldType ft = searcher.getSchema().getFieldType(field);
int i = 0;
final FieldFacetStats[] finfo = new FieldFacetStats[facet.length];
//Initialize facetstats, if facets have been passed in
FieldCache.StringIndex si;
for (String f : facet) {
ft = searcher.getSchema().getFieldType(f);
try {
si = FieldCache.DEFAULT.getStringIndex(searcher.getReader(), f);
}
catch (IOException e) {
throw new RuntimeException("failed to open field cache for: " + f, e);
}
finfo[i++] = new FieldFacetStats(f, si, ft, numTermsInField);
}
final int[] index = this.index; final int[] index = this.index;
final int[] counts = new int[numTermsInField]; final int[] counts = new int[numTermsInField];//keep track of the number of times we see each word in the field for all the documents in the docset
NumberedTermEnum te = ti.getEnumerator(searcher.getReader()); NumberedTermEnum te = ti.getEnumerator(searcher.getReader());
@ -769,11 +769,11 @@ public class UnInvertedField {
if (c > 0) { if (c > 0) {
allstats.addMissing(c); allstats.addMissing(c);
} }
} if (finfo.length > 0) {
if (finfo.length > 0) { allstats.facets = new HashMap<String, Map<String, StatsValues>>();
allstats.facets = new HashMap<String, Map<String, StatsValues>>(); for (FieldFacetStats f : finfo) {
for (FieldFacetStats f : finfo) { allstats.facets.put(f.name, f.facetStatsValues);
allstats.facets.put(f.name, f.facetStatsValues); }
} }
} }
return allstats; return allstats;

View File

@ -82,32 +82,27 @@ public class StatsComponentTest extends AbstractSolrTestCase {
assertU(adoc("id", "1", "stats_ii", "-10", "stats_ii", "-100", "active_s", "true")); assertU(adoc("id", "1", "stats_ii", "-10", "stats_ii", "-100", "active_s", "true"));
assertU(adoc("id", "2", "stats_ii", "-20", "stats_ii", "200", "active_s", "true")); assertU(adoc("id", "2", "stats_ii", "-20", "stats_ii", "200", "active_s", "true"));
assertU(adoc("id", "3", "stats_ii", "-30", "stats_ii", "-1", "active_s", "false")); assertU(adoc("id", "3", "stats_ii", "-30", "stats_ii", "-1", "active_s", "false"));
assertU(adoc("id", "4", "stats_ii", "-40", "stats_ii", "10", "active_s", "false")); assertU(adoc("id", "4", "stats_ii", "-40", "stats_ii", "10", "active_s", "false"));
assertU(adoc("id", "5", "active_s", "false"));
assertU(commit()); assertU(commit());
Map<String, String> args = new HashMap<String, String>(); Map<String, String> args = new HashMap<String, String>();
args.put(CommonParams.Q, "*:*"); args.put(CommonParams.Q, "*:*");
args.put(StatsParams.STATS, "true"); args.put(StatsParams.STATS, "true");
args.put(StatsParams.STATS_FIELD, "stats_ii"); args.put(StatsParams.STATS_FIELD, "stats_ii");
args.put("indent", "true"); args.put("indent", "true");
SolrQueryRequest req = new LocalSolrQueryRequest(core, new MapSolrParams(args)); SolrQueryRequest req = new LocalSolrQueryRequest(core, new MapSolrParams(args));
assertQ("test statistics values", req assertQ("test statistics values", req
, "//double[@name='min'][.='-100.0']" , "//double[@name='min'][.='-100.0']"
, "//double[@name='max'][.='200.0']" , "//double[@name='max'][.='200.0']"
, "//double[@name='sum'][.='9.0']" , "//double[@name='sum'][.='9.0']"
, "//long[@name='count'][.='8']" , "//long[@name='count'][.='8']"
, "//long[@name='missing'][.='0']" , "//long[@name='missing'][.='1']"
, "//double[@name='sumOfSquares'][.='53101.0']" , "//double[@name='sumOfSquares'][.='53101.0']"
, "//double[@name='mean'][.='1.125']" , "//double[@name='mean'][.='1.125']"
, "//double[@name='stddev'][.='87.08852228787508']" , "//double[@name='stddev'][.='87.08852228787508']"
); );
args.put(StatsParams.STATS_FACET, "active_s"); args.put(StatsParams.STATS_FACET, "active_s");
req = new LocalSolrQueryRequest(core, new MapSolrParams(args)); req = new LocalSolrQueryRequest(core, new MapSolrParams(args));
@ -116,15 +111,11 @@ public class StatsComponentTest extends AbstractSolrTestCase {
, "//double[@name='max'][.='200.0']" , "//double[@name='max'][.='200.0']"
, "//double[@name='sum'][.='9.0']" , "//double[@name='sum'][.='9.0']"
, "//long[@name='count'][.='8']" , "//long[@name='count'][.='8']"
, "//long[@name='missing'][.='0']" , "//long[@name='missing'][.='1']"
, "//double[@name='sumOfSquares'][.='53101.0']" , "//double[@name='sumOfSquares'][.='53101.0']"
, "//double[@name='mean'][.='1.125']" , "//double[@name='mean'][.='1.125']"
, "//double[@name='stddev'][.='87.08852228787508']" , "//double[@name='stddev'][.='87.08852228787508']"
); );
assertQ("test value for active_s=true", req assertQ("test value for active_s=true", req
, "//lst[@name='true']/double[@name='min'][.='-100.0']" , "//lst[@name='true']/double[@name='min'][.='-100.0']"
, "//lst[@name='true']/double[@name='max'][.='200.0']" , "//lst[@name='true']/double[@name='max'][.='200.0']"
@ -135,6 +126,17 @@ public class StatsComponentTest extends AbstractSolrTestCase {
, "//lst[@name='true']/double[@name='mean'][.='17.5']" , "//lst[@name='true']/double[@name='mean'][.='17.5']"
, "//lst[@name='true']/double[@name='stddev'][.='128.16005617976296']" , "//lst[@name='true']/double[@name='stddev'][.='128.16005617976296']"
); );
//Test for fixing multivalued missing
/*assertQ("test value for active_s=false", req
, "//lst[@name='false']/double[@name='min'][.='-40.0']"
, "//lst[@name='false']/double[@name='max'][.='10.0']"
, "//lst[@name='false']/double[@name='sum'][.='-61.0']"
, "//lst[@name='false']/long[@name='count'][.='4']"
, "//lst[@name='false']/long[@name='missing'][.='1']"
, "//lst[@name='false']/double[@name='sumOfSquares'][.='2601.0']"
, "//lst[@name='false']/double[@name='mean'][.='-15.22']"
, "//lst[@name='false']/double[@name='stddev'][.='23.59908190304586']"
);*/
} }
@ -205,4 +207,43 @@ public class StatsComponentTest extends AbstractSolrTestCase {
, "//lst[@name='false']/double[@name='stddev'][.='7.0710678118654755']" , "//lst[@name='false']/double[@name='stddev'][.='7.0710678118654755']"
); );
} }
public void testFacetStatisticsMissingResult() throws Exception {
SolrCore core = h.getCore();
assertU(adoc("id", "1", "stats_i", "10", "active_s", "true"));
assertU(adoc("id", "2", "stats_i", "20", "active_s", "true"));
assertU(adoc("id", "3", "active_s", "false"));
assertU(adoc("id", "4", "stats_i", "40", "active_s", "false"));
assertU(commit());
Map<String, String> args = new HashMap<String, String>();
args.put(CommonParams.Q, "*:*");
args.put(StatsParams.STATS, "true");
args.put(StatsParams.STATS_FIELD, "stats_i");
args.put(StatsParams.STATS_FACET, "active_s");
args.put("indent", "true");
SolrQueryRequest req = new LocalSolrQueryRequest(core, new MapSolrParams(args));
assertQ("test value for active_s=true", req
, "//lst[@name='true']/double[@name='min'][.='10.0']"
, "//lst[@name='true']/double[@name='max'][.='20.0']"
, "//lst[@name='true']/double[@name='sum'][.='30.0']"
, "//lst[@name='true']/long[@name='count'][.='2']"
, "//lst[@name='true']/long[@name='missing'][.='0']"
, "//lst[@name='true']/double[@name='sumOfSquares'][.='500.0']"
, "//lst[@name='true']/double[@name='mean'][.='15.0']"
, "//lst[@name='true']/double[@name='stddev'][.='7.0710678118654755']"
);
assertQ("test value for active_s=false", req
, "//lst[@name='false']/double[@name='min'][.='40.0']"
, "//lst[@name='false']/double[@name='max'][.='40.0']"
, "//lst[@name='false']/double[@name='sum'][.='40.0']"
, "//lst[@name='false']/long[@name='count'][.='1']"
, "//lst[@name='false']/long[@name='missing'][.='1']"
, "//lst[@name='false']/double[@name='sumOfSquares'][.='1600.0']"
, "//lst[@name='false']/double[@name='mean'][.='40.0']"
, "//lst[@name='false']/double[@name='stddev'][.='0.0']"
);
}
} }