I think you are correct -- deinitely looks like a bug to me... https://issues.apache.org/jira/browse/LUCENE-5790
: Date: Fri, 13 Jun 2014 10:45:12 +0000 : From: 海老澤 志信 <shinobu_ebis...@waku-2.com> : Reply-To: solr-user@lucene.apache.org : To: "solr-user@lucene.apache.org" <solr-user@lucene.apache.org> : Subject: group.ngroups is set to an incorrect value - specific field types : : Hi, : : I'm using Solr version 4.1. : I found a bug in group.ngroups. So could anyone kindly take a look at my bug report? : : If I specify the type Double as group.field, the value of group.ngroups is set to be an incorrect value. : : [condition] : - Double is defined in group.field : - Documents without the field which is defined as group.field, : : [Sample query and Example] : ------------------------------- : solr/select?q=*:*&group=true&group.ngroups=true&group.field=Double_Field : : * "Double_Field" is defined "solr.TrieDoubleField" type. : ------------------------------- : When documents with group.field are 4 and documents without group.field are 6, : then it turns out 10 of group.ngroups as result of the query. : : But I think that group.ngroups should be 5 rightly in this case. : : [Root Cause] : It seems there is a bug in the source code of Lucene. : There is a function that compares a list of whether these groups contain the same group.field, : It calls MutableValueDouble.compareSameType(). : : See below the point which seems to be a root cause. : ----------------------------- : if (!exists) return -1; : if (!b.exists) return 1; : ----------------------------- : If "exists" is false, it return -1. : : But I think it should return 0, when "exists" and "b.exists" are equal. : : [Similar problem] : There is a similar problem to MutableValueBool.compareSameType(). : Therefore, when you grouping the field of type Boolean (solr.BoolField), : value of group.ngroups is always 0 or 1 . : : [Solution] : I propose the following modifications: MutableValueDouble.compareSameType() : : =================================================================== : --- MutableValueDouble.java : +++ MutableValueDouble.java : @@ -54,9 +54,8 @@ : MutableValueDouble b = (MutableValueDouble)other; : int c = Double.compare(value, b.value); : if (c != 0) return c; : - if (!exists) return -1; : - if (!b.exists) return 1; : - return 0; : + if (exists == b.exists) return 0; : + return exists ? 1 : -1; : } : =================================================================== : : I propose the following modifications: MutableValueBool.compareSameType() : : =================================================================== : --- MutableValueBool.java : +++ MutableValueBool.java : @@ -52,7 +52,7 @@ : @Override : public int compareSameType(Object other) { : MutableValueBool b = (MutableValueBool)other; : - if (value != b.value) return value ? 1 : 0; : + if (value != b.value) return value ? 1 : -1; : if (exists == b.exists) return 0; : return exists ? 1 : -1; : } : =================================================================== : : : Thanks, : : Ebisawa : : -Hoss http://www.lucidworks.com/