Skip to content
Open
Show file tree
Hide file tree
Changes from all 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