mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-26 06:46:10 +00:00
faster handling of a case where each doc has multi valued values for different facets, also, don't take into account missing value values (and in the future, we can also count those per bucket if needed)
This commit is contained in:
parent
b479bc58f9
commit
4603d10501
@ -111,6 +111,8 @@ public class ValueDateHistogramFacetCollector extends AbstractFacetCollector {
|
|||||||
|
|
||||||
NumericFieldData valueFieldData;
|
NumericFieldData valueFieldData;
|
||||||
|
|
||||||
|
final ValueAggregator valueAggregator = new ValueAggregator();
|
||||||
|
|
||||||
public DateHistogramProc(long interval) {
|
public DateHistogramProc(long interval) {
|
||||||
this.interval = interval;
|
this.interval = interval;
|
||||||
}
|
}
|
||||||
@ -123,48 +125,26 @@ public class ValueDateHistogramFacetCollector extends AbstractFacetCollector {
|
|||||||
|
|
||||||
InternalFullDateHistogramFacet.FullEntry entry = entries.get(time);
|
InternalFullDateHistogramFacet.FullEntry entry = entries.get(time);
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
if (valueFieldData.multiValued()) {
|
entry = new InternalFullDateHistogramFacet.FullEntry(time, 0, Double.MAX_VALUE, Double.MIN_VALUE, 0, 0);
|
||||||
double[] valuesValues = valueFieldData.doubleValues(docId);
|
|
||||||
entry = new InternalFullDateHistogramFacet.FullEntry(time, 1, Double.MAX_VALUE, Double.MIN_VALUE, valuesValues.length, 0);
|
|
||||||
for (double valueValue : valuesValues) {
|
|
||||||
entry.total += valueValue;
|
|
||||||
if (valueValue < entry.min) {
|
|
||||||
entry.min = valueValue;
|
|
||||||
}
|
|
||||||
if (valueValue > entry.max) {
|
|
||||||
entry.max = valueValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
entries.put(time, entry);
|
|
||||||
} else {
|
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
|
||||||
entry = new InternalFullDateHistogramFacet.FullEntry(time, 1, valueValue, valueValue, 1, valueValue);
|
|
||||||
entries.put(time, entry);
|
entries.put(time, entry);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
entry.count++;
|
entry.count++;
|
||||||
if (valueFieldData.multiValued()) {
|
valueAggregator.entry = entry;
|
||||||
double[] valuesValues = valueFieldData.doubleValues(docId);
|
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
||||||
entry.totalCount += valuesValues.length;
|
|
||||||
for (double valueValue : valuesValues) {
|
|
||||||
entry.total += valueValue;
|
|
||||||
if (valueValue < entry.min) {
|
|
||||||
entry.min = valueValue;
|
|
||||||
}
|
}
|
||||||
if (valueValue > entry.max) {
|
|
||||||
entry.max = valueValue;
|
public static class ValueAggregator implements NumericFieldData.DoubleValueInDocProc {
|
||||||
}
|
|
||||||
}
|
InternalFullDateHistogramFacet.FullEntry entry;
|
||||||
} else {
|
|
||||||
|
@Override public void onValue(int docId, double value) {
|
||||||
entry.totalCount++;
|
entry.totalCount++;
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
entry.total += value;
|
||||||
entry.total += valueValue;
|
if (value < entry.min) {
|
||||||
if (valueValue < entry.min) {
|
entry.min = value;
|
||||||
entry.min = valueValue;
|
|
||||||
}
|
|
||||||
if (valueValue > entry.max) {
|
|
||||||
entry.max = valueValue;
|
|
||||||
}
|
}
|
||||||
|
if (value > entry.max) {
|
||||||
|
entry.max = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,8 @@ public class ValueGeoDistanceFacetCollector extends GeoDistanceFacetCollector {
|
|||||||
|
|
||||||
NumericFieldData valueFieldData;
|
NumericFieldData valueFieldData;
|
||||||
|
|
||||||
|
final ValueAggregator valueAggregator = new ValueAggregator();
|
||||||
|
|
||||||
public Aggregator(double lat, double lon, GeoDistance geoDistance, DistanceUnit unit, GeoDistanceFacet.Entry[] entries) {
|
public Aggregator(double lat, double lon, GeoDistance geoDistance, DistanceUnit unit, GeoDistanceFacet.Entry[] entries) {
|
||||||
this.lat = lat;
|
this.lat = lat;
|
||||||
this.lon = lon;
|
this.lon = lon;
|
||||||
@ -89,21 +91,19 @@ public class ValueGeoDistanceFacetCollector extends GeoDistanceFacetCollector {
|
|||||||
if (distance >= entry.getFrom() && distance < entry.getTo()) {
|
if (distance >= entry.getFrom() && distance < entry.getTo()) {
|
||||||
entry.foundInDoc = true;
|
entry.foundInDoc = true;
|
||||||
entry.count++;
|
entry.count++;
|
||||||
if (valueFieldData.multiValued()) {
|
valueAggregator.entry = entry;
|
||||||
double[] values = valueFieldData.doubleValues(docId);
|
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
||||||
entry.totalCount += values.length;
|
|
||||||
for (double value : values) {
|
|
||||||
entry.total += value;
|
|
||||||
if (value < entry.min) {
|
|
||||||
entry.min = value;
|
|
||||||
}
|
|
||||||
if (value > entry.max) {
|
|
||||||
entry.max = value;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (valueFieldData.hasValue(docId)) {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ValueAggregator implements NumericFieldData.DoubleValueInDocProc {
|
||||||
|
|
||||||
|
GeoDistanceFacet.Entry entry;
|
||||||
|
|
||||||
|
@Override public void onValue(int docId, double value) {
|
||||||
entry.totalCount++;
|
entry.totalCount++;
|
||||||
double value = valueFieldData.doubleValue(docId);
|
|
||||||
entry.total += value;
|
entry.total += value;
|
||||||
if (value < entry.min) {
|
if (value < entry.min) {
|
||||||
entry.min = value;
|
entry.min = value;
|
||||||
@ -114,6 +114,3 @@ public class ValueGeoDistanceFacetCollector extends GeoDistanceFacetCollector {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -139,34 +139,12 @@ public class BoundedValueHistogramFacetCollector extends AbstractFacetCollector
|
|||||||
int index = ((int) ((value + offset) / interval));
|
int index = ((int) ((value + offset) / interval));
|
||||||
InternalBoundedFullHistogramFacet.FullEntry entry = (InternalBoundedFullHistogramFacet.FullEntry) entries[index];
|
InternalBoundedFullHistogramFacet.FullEntry entry = (InternalBoundedFullHistogramFacet.FullEntry) entries[index];
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
if (valueFieldData.multiValued()) {
|
entry = new InternalBoundedFullHistogramFacet.FullEntry(index, 0, Double.MAX_VALUE, Double.MIN_VALUE, 0, 0);
|
||||||
entry = new InternalBoundedFullHistogramFacet.FullEntry(index, 1, Double.MAX_VALUE, Double.MIN_VALUE, 0, 0);
|
|
||||||
entries[index] = entry;
|
|
||||||
|
|
||||||
valueAggregator.entry = entry;
|
|
||||||
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
|
||||||
} else {
|
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
|
||||||
entry = new InternalBoundedFullHistogramFacet.FullEntry(index, 1, valueValue, valueValue, 1, valueValue);
|
|
||||||
entries[index] = entry;
|
entries[index] = entry;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
entry.count++;
|
entry.count++;
|
||||||
if (valueFieldData.multiValued()) {
|
|
||||||
valueAggregator.entry = entry;
|
valueAggregator.entry = entry;
|
||||||
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
||||||
} else {
|
|
||||||
entry.totalCount++;
|
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
|
||||||
entry.total += valueValue;
|
|
||||||
if (valueValue < entry.min) {
|
|
||||||
entry.min = valueValue;
|
|
||||||
}
|
|
||||||
if (valueValue > entry.max) {
|
|
||||||
entry.max = valueValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,33 +119,12 @@ public class ValueHistogramFacetCollector extends AbstractFacetCollector {
|
|||||||
long bucket = FullHistogramFacetCollector.bucket(value, interval);
|
long bucket = FullHistogramFacetCollector.bucket(value, interval);
|
||||||
InternalFullHistogramFacet.FullEntry entry = entries.get(bucket);
|
InternalFullHistogramFacet.FullEntry entry = entries.get(bucket);
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
if (valueFieldData.multiValued()) {
|
entry = new InternalFullHistogramFacet.FullEntry(bucket, 0, Double.MAX_VALUE, Double.MIN_VALUE, 0, 0);
|
||||||
entry = new InternalFullHistogramFacet.FullEntry(bucket, 1, Double.MAX_VALUE, Double.MIN_VALUE, 0, 0);
|
|
||||||
entries.put(bucket, entry);
|
|
||||||
valueAggregator.entry = entry;
|
|
||||||
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
|
||||||
} else {
|
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
|
||||||
entry = new InternalFullHistogramFacet.FullEntry(bucket, 1, valueValue, valueValue, 1, valueValue);
|
|
||||||
entries.put(bucket, entry);
|
entries.put(bucket, entry);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
entry.count++;
|
entry.count++;
|
||||||
if (valueFieldData.multiValued()) {
|
|
||||||
valueAggregator.entry = entry;
|
valueAggregator.entry = entry;
|
||||||
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
||||||
} else {
|
|
||||||
entry.totalCount++;
|
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
|
||||||
entry.total += valueValue;
|
|
||||||
if (valueValue < entry.min) {
|
|
||||||
entry.min = valueValue;
|
|
||||||
}
|
|
||||||
if (valueValue > entry.max) {
|
|
||||||
entry.max = valueValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ValueAggregator implements NumericFieldData.DoubleValueInDocProc {
|
public static class ValueAggregator implements NumericFieldData.DoubleValueInDocProc {
|
||||||
|
@ -162,26 +162,12 @@ public class TermsStatsDoubleFacetCollector extends AbstractFacetCollector {
|
|||||||
@Override public void onValue(int docId, double value) {
|
@Override public void onValue(int docId, double value) {
|
||||||
InternalTermsStatsDoubleFacet.DoubleEntry doubleEntry = entries.get(value);
|
InternalTermsStatsDoubleFacet.DoubleEntry doubleEntry = entries.get(value);
|
||||||
if (doubleEntry == null) {
|
if (doubleEntry == null) {
|
||||||
doubleEntry = new InternalTermsStatsDoubleFacet.DoubleEntry(value, 1, 0, 0, Double.MAX_VALUE, Double.MIN_VALUE);
|
doubleEntry = new InternalTermsStatsDoubleFacet.DoubleEntry(value, 0, 0, 0, Double.MAX_VALUE, Double.MIN_VALUE);
|
||||||
entries.put(value, doubleEntry);
|
entries.put(value, doubleEntry);
|
||||||
} else {
|
|
||||||
doubleEntry.count++;
|
|
||||||
}
|
}
|
||||||
|
doubleEntry.count++;
|
||||||
if (valueFieldData.multiValued()) {
|
|
||||||
valueAggregator.doubleEntry = doubleEntry;
|
valueAggregator.doubleEntry = doubleEntry;
|
||||||
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
||||||
} else {
|
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
|
||||||
if (valueValue < doubleEntry.min) {
|
|
||||||
doubleEntry.min = valueValue;
|
|
||||||
}
|
|
||||||
if (valueValue > doubleEntry.max) {
|
|
||||||
doubleEntry.max = valueValue;
|
|
||||||
}
|
|
||||||
doubleEntry.totalCount++;
|
|
||||||
doubleEntry.total += valueValue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onMissing(int docId) {
|
@Override public void onMissing(int docId) {
|
||||||
|
@ -165,25 +165,12 @@ public class TermsStatsLongFacetCollector extends AbstractFacetCollector {
|
|||||||
@Override public void onValue(int docId, long value) {
|
@Override public void onValue(int docId, long value) {
|
||||||
InternalTermsStatsLongFacet.LongEntry longEntry = entries.get(value);
|
InternalTermsStatsLongFacet.LongEntry longEntry = entries.get(value);
|
||||||
if (longEntry == null) {
|
if (longEntry == null) {
|
||||||
longEntry = new InternalTermsStatsLongFacet.LongEntry(value, 1, 0, 0, Double.MAX_VALUE, Double.MIN_VALUE);
|
longEntry = new InternalTermsStatsLongFacet.LongEntry(value, 0, 0, 0, Double.MAX_VALUE, Double.MIN_VALUE);
|
||||||
entries.put(value, longEntry);
|
entries.put(value, longEntry);
|
||||||
} else {
|
|
||||||
longEntry.count++;
|
|
||||||
}
|
}
|
||||||
if (valueFieldData.multiValued()) {
|
longEntry.count++;
|
||||||
valueAggregator.longEntry = longEntry;
|
valueAggregator.longEntry = longEntry;
|
||||||
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
||||||
} else {
|
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
|
||||||
if (valueValue < longEntry.min) {
|
|
||||||
longEntry.min = valueValue;
|
|
||||||
}
|
|
||||||
if (valueValue > longEntry.max) {
|
|
||||||
longEntry.max = valueValue;
|
|
||||||
}
|
|
||||||
longEntry.totalCount++;
|
|
||||||
longEntry.total += valueValue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onMissing(int docId) {
|
@Override public void onMissing(int docId) {
|
||||||
|
@ -164,26 +164,12 @@ public class TermsStatsStringFacetCollector extends AbstractFacetCollector {
|
|||||||
@Override public void onValue(int docId, String value) {
|
@Override public void onValue(int docId, String value) {
|
||||||
InternalTermsStatsStringFacet.StringEntry stringEntry = entries.get(value);
|
InternalTermsStatsStringFacet.StringEntry stringEntry = entries.get(value);
|
||||||
if (stringEntry == null) {
|
if (stringEntry == null) {
|
||||||
stringEntry = new InternalTermsStatsStringFacet.StringEntry(value, 1, 0, 0, Double.MAX_VALUE, Double.MIN_VALUE);
|
stringEntry = new InternalTermsStatsStringFacet.StringEntry(value, 0, 0, 0, Double.MAX_VALUE, Double.MIN_VALUE);
|
||||||
entries.put(value, stringEntry);
|
entries.put(value, stringEntry);
|
||||||
} else {
|
|
||||||
stringEntry.count++;
|
|
||||||
}
|
}
|
||||||
if (valueFieldData.multiValued()) {
|
stringEntry.count++;
|
||||||
valueAggregator.stringEntry = stringEntry;
|
valueAggregator.stringEntry = stringEntry;
|
||||||
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
valueFieldData.forEachValueInDoc(docId, valueAggregator);
|
||||||
} else {
|
|
||||||
double valueValue = valueFieldData.doubleValue(docId);
|
|
||||||
if (valueValue < stringEntry.min) {
|
|
||||||
stringEntry.min = valueValue;
|
|
||||||
}
|
|
||||||
if (valueValue > stringEntry.max) {
|
|
||||||
stringEntry.max = valueValue;
|
|
||||||
}
|
|
||||||
stringEntry.total += valueValue;
|
|
||||||
stringEntry.totalCount++;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onMissing(int docId) {
|
@Override public void onMissing(int docId) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user