Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lucene/CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,8 @@ Optimizations

* GITHUB#14863: Perform scoring for 4, 7, 8 bit quantized vectors off-heap. (Kaival Parikh)

* GITHUB#15261: Implement longValues for MultiFieldNormValues to speedup CombinedQuery (Ge Song)

Bug Fixes
---------------------
* GITHUB#14161: PointInSetQuery's constructor now throws IllegalArgumentException
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.NumericDocValues;
import org.apache.lucene.internal.hppc.FloatArrayList;
import org.apache.lucene.search.CombinedFieldQuery.FieldAndWeight;
import org.apache.lucene.search.similarities.Similarity.BulkSimScorer;
import org.apache.lucene.search.similarities.Similarity.SimScorer;
Expand Down Expand Up @@ -127,8 +129,10 @@ public float score(int doc, float freq) throws IOException {
*/
public void scoreRange(DocAndFloatFeatureBuffer buffer) throws IOException {
normValues = ArrayUtil.growNoCopy(normValues, buffer.size);
for (int i = 0; i < buffer.size; i++) {
normValues[i] = getNormValue(buffer.docs[i]);
if (norms != null) {
norms.longValues(buffer.size, buffer.docs, normValues, 1L);
} else {
Arrays.fill(normValues, 0, buffer.size, 1L);
}
bulkScorer.score(buffer.size, buffer.features, normValues, buffer.features);
}
Expand All @@ -145,6 +149,7 @@ public Explanation explain(int doc, Explanation freqExpl) throws IOException {

private static class MultiFieldNormValues extends NumericDocValues {
private final NumericDocValues[] normsArr;
private float[] accBuf = FloatArrayList.EMPTY_ARRAY;
private final float[] weightArr;
private long current;
private int docID = -1;
Expand Down Expand Up @@ -193,5 +198,31 @@ public int advance(int target) {
public long cost() {
throw new UnsupportedOperationException();
}

@Override
public void longValues(int size, int[] docs, long[] values, long defaultValue)
throws IOException {
if (accBuf.length < size) {
accBuf = new float[ArrayUtil.oversize(size, Float.BYTES)];
} else {
Arrays.fill(accBuf, 0f);
}

for (int i = 0; i < normsArr.length; i++) {
normsArr[i].longValues(size, docs, values, 0L);
float weight = weightArr[i];
for (int j = 0; j < size; j++) {
accBuf[j] += weight * LENGTH_TABLE[Byte.toUnsignedInt((byte) values[j])];
}
}

for (int i = 0; i < size; i++) {
if (accBuf[i] == 0f) {
values[i] = defaultValue;
} else {
values[i] = SmallFloat.intToByte4(Math.round(accBuf[i]));
}
}
}
}
}
Loading