Skip to content

Commit db0a8c8

Browse files
Jack Hung0ctopus13prime
authored andcommitted
Updated Lucene BBQ integration and made it default
1 parent 65d8a0b commit db0a8c8

27 files changed

+577
-375
lines changed

qa/restart-upgrade/build.gradle

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ apply from : "$rootDir/qa/build.gradle"
1010

1111
dependencies {
1212
// Ensure Guava is available for BWC test compilation
13-
testImplementation group: 'com.google.guava', name: 'guava', version:'33.2.1-jre'
13+
testImplementation group: 'com.google.guava', name: 'guava', version: "${versions.guava}"
1414
}
1515

1616
String default_bwc_version = System.getProperty("bwc.version")
@@ -111,10 +111,12 @@ task testAgainstOldCluster(type: StandaloneRestIntegTestTask) {
111111
}
112112

113113
// excludes: 1.any; 2.x where x < 17
114-
def validPrefixesForQFrameBitEncoderBWCChecks = ['1.'] + ((0..16).collect { "2.${it}." } as Collection<String>)
115-
if (validPrefixesForQFrameBitEncoderBWCChecks.any { knn_bwc_version.startsWith(it) }
114+
def invalidPrefixesForQFrameBitEncoderAndLuceneBBQBWCChecks = ['1.'] + ((0..16).collect { "2.${it}." } as Collection<String>)
115+
if (invalidPrefixesForQFrameBitEncoderAndLuceneBBQBWCChecks.any { knn_bwc_version.startsWith(it) }
116116
) {
117117
filter {
118+
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testKNNIndexLucene4xBWC"
119+
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testKNNIndexLuceneOnDiskNoCompressionBWC"
118120
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testDiskBasedMergeBWC"
119121
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testRandomRotationBWC"
120122
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testADC_BWC"
@@ -271,9 +273,11 @@ task testRestartUpgrade(type: StandaloneRestIntegTestTask) {
271273
}
272274
}
273275

274-
def validPrefixesForQFrameBitEncoderBWCChecks = ['1.'] + ((0..16).collect { "2.${it}." } as Collection<String>)
275-
if (validPrefixesForQFrameBitEncoderBWCChecks.any { knn_bwc_version.startsWith(it) }) {
276+
def invalidPrefixesForQFrameBitEncoderAndLuceneBBQBWCChecks = ['1.'] + ((0..16).collect { "2.${it}." } as Collection<String>)
277+
if (invalidPrefixesForQFrameBitEncoderAndLuceneBBQBWCChecks.any { knn_bwc_version.startsWith(it) }) {
276278
filter {
279+
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testKNNIndexLucene4xBWC"
280+
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testKNNIndexLuceneOnDiskNoCompressionBWC"
277281
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testDiskBasedMergeBWC"
278282
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testRandomRotationBWC"
279283
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testADC_BWC"
@@ -340,11 +344,12 @@ task testRestartUpgrade(type: StandaloneRestIntegTestTask) {
340344
}
341345
}
342346

343-
if (knn_bwc_version.startsWith("1.") || knn_bwc_version.startsWith("2.") || knn_bwc_version.startsWith("3.0")) {
344-
filter {
345-
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testKNNIndexLuceneBBQ"
346-
}
347+
def invalidPrefixesForLuceneBBQChecks = ['1.', '2.'] + ((0..5).collect { "3.${it}." } as Collection<String>)
348+
if (invalidPrefixesForLuceneBBQChecks.any { knn_bwc_version.startsWith(it) }) {
349+
filter {
350+
excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testKNNIndexLuceneBBQ"
347351
}
352+
}
348353

349354
nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}")
350355
nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}")

qa/restart-upgrade/src/test/java/org/opensearch/knn/bwc/IndexingIT.java

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,88 @@ public void testRandomRotationBWC() throws Exception {
674674
}
675675
}
676676

677+
private void testKNNAfterBBQIntegrationBWCRunner(String mapping) throws Exception {
678+
waitForClusterHealthGreen(NODES_BWC_CLUSTER);
679+
int k = 4;
680+
int dimension = 8;
681+
682+
float[] queryVector = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f };
683+
int[] expectedOrder = { 1, 2, 3, 4 }; // Using Inner product
684+
if (isRunningAgainstOldCluster()) {
685+
createKnnIndex(testIndex, getKNNDefaultIndexSettings(), mapping);
686+
687+
Float[] vector1 = { 1.0f, 2.0f, 3.0f, 12.0f, 5.0f, 6.0f, 7.0f, 8.0f };
688+
Float[] vector2 = { 1.0f, 2.0f, 7.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f };
689+
Float[] vector3 = { 1.0f, 4.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f };
690+
Float[] vector4 = { 2.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f };
691+
addKnnDoc(testIndex, "1", TEST_FIELD, vector1);
692+
addKnnDoc(testIndex, "2", TEST_FIELD, vector2);
693+
addKnnDoc(testIndex, "3", TEST_FIELD, vector3);
694+
addKnnDoc(testIndex, "4", TEST_FIELD, vector4);
695+
696+
Response searchResponse = searchKNNIndex(testIndex, new KNNQueryBuilder(TEST_FIELD, queryVector, k), k);
697+
List<KNNResult> results = parseSearchResponse(EntityUtils.toString(searchResponse.getEntity()), TEST_FIELD);
698+
assertEquals(k, results.size());
699+
for (int i = 0; i < k; i++) {
700+
assertEquals(expectedOrder[i], Integer.parseInt(results.get(i).getDocId()));
701+
}
702+
} else {
703+
Response searchResponse = searchKNNIndex(testIndex, new KNNQueryBuilder(TEST_FIELD, queryVector, k), k);
704+
List<KNNResult> results = parseSearchResponse(EntityUtils.toString(searchResponse.getEntity()), TEST_FIELD);
705+
assertEquals(k, results.size());
706+
for (int i = 0; i < k; i++) {
707+
assertEquals(expectedOrder[i], Integer.parseInt(results.get(i).getDocId()));
708+
}
709+
deleteKNNIndex(testIndex);
710+
}
711+
}
712+
713+
public void testKNNIndexLucene4xBWC() throws Exception {
714+
// Verify that old lucene indices with compression level
715+
// specified still work
716+
int dimension = 8;
717+
String mapping = XContentFactory.jsonBuilder()
718+
.startObject()
719+
.startObject("properties")
720+
.startObject(TEST_FIELD)
721+
.field(VECTOR_TYPE, KNN_VECTOR)
722+
.field(DIMENSION, dimension)
723+
.field(COMPRESSION_LEVEL_PARAMETER, CompressionLevel.x4.getName())
724+
.startObject(KNN_METHOD)
725+
.field(NAME, METHOD_HNSW)
726+
.field(METHOD_PARAMETER_SPACE_TYPE, SpaceType.INNER_PRODUCT.getValue())
727+
.field(KNN_ENGINE, LUCENE_NAME)
728+
.endObject()
729+
.endObject()
730+
.endObject()
731+
.endObject()
732+
.toString();
733+
testKNNAfterBBQIntegrationBWCRunner(mapping);
734+
}
735+
736+
public void testKNNIndexLuceneOnDiskNoCompressionBWC() throws Exception {
737+
// Pre-3.6, Lucene with ON_DISK defaults to 4x. Post-3.6, default
738+
// is now 32x. Verify old indices still work
739+
int dimension = 8;
740+
String mapping = XContentFactory.jsonBuilder()
741+
.startObject()
742+
.startObject("properties")
743+
.startObject(TEST_FIELD)
744+
.field(VECTOR_TYPE, KNN_VECTOR)
745+
.field(DIMENSION, dimension)
746+
.field(MODE_PARAMETER, Mode.ON_DISK.getName())
747+
.startObject(KNN_METHOD)
748+
.field(NAME, METHOD_HNSW)
749+
.field(METHOD_PARAMETER_SPACE_TYPE, SpaceType.INNER_PRODUCT.getValue())
750+
.field(KNN_ENGINE, LUCENE_NAME)
751+
.endObject()
752+
.endObject()
753+
.endObject()
754+
.endObject()
755+
.toString();
756+
testKNNAfterBBQIntegrationBWCRunner(mapping);
757+
}
758+
677759
public void testKNNIndexLuceneBBQ() throws Exception {
678760
waitForClusterHealthGreen(NODES_BWC_CLUSTER);
679761

@@ -739,7 +821,6 @@ public void testKNNIndexLuceneBBQ() throws Exception {
739821
}
740822
}
741823

742-
743824
/**
744825
* Tests merge flow from 2.x version 2.17 and up against version >3.2 to validate merges with old/new
745826
* segments are successful.

qa/rolling-upgrade/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ apply from : "$rootDir/qa/build.gradle"
1010

1111
dependencies {
1212
// Ensure Guava is available for BWC test compilation
13-
testImplementation group: 'com.google.guava', name: 'guava', version:'33.2.1-jre'
13+
testImplementation group: 'com.google.guava', name: 'guava', version: "${versions.guava}"
1414
}
1515

1616
String default_bwc_version = System.getProperty("bwc.version")

src/main/java/org/opensearch/knn/common/KNNConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public class KNNConstants {
105105
public static final double MAXIMUM_CONFIDENCE_INTERVAL = 1.0;
106106
public static final String LUCENE_SQ_BITS = "bits";
107107
public static final int LUCENE_SQ_DEFAULT_BITS = 7;
108-
public static final String ENCODER_BBQ = "binary";
108+
public static final String ENCODER_BBQ = "bbq";
109109
public static final int LUCENE_BBQ_DEFAULT_BITS = 1;
110110
public static final String LUCENE_BBQ_BITS = "bits";
111111
public static final String MAX_CONNECTIONS = "max_connections";

src/main/java/org/opensearch/knn/index/codec/KNN1040Codec/KNN1040PerFieldKnnVectorsFormat.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.apache.lucene.codecs.KnnVectorsFormat;
1010
import org.apache.lucene.codecs.lucene99.Lucene99HnswVectorsFormat;
1111
import org.apache.lucene.codecs.lucene104.Lucene104ScalarQuantizedVectorsFormat;
12+
import org.apache.lucene.codecs.lucene104.Lucene104HnswScalarQuantizedVectorsFormat;
1213
import org.opensearch.common.collect.Tuple;
1314
import org.opensearch.index.mapper.MapperService;
1415
import org.opensearch.knn.index.KNNSettings;
@@ -18,6 +19,7 @@
1819
import org.opensearch.knn.index.codec.LuceneVectorsFormatType;
1920
import org.opensearch.knn.index.codec.KNN9120Codec.KNN9120HnswBinaryVectorsFormat;
2021
import org.opensearch.knn.index.codec.nativeindex.NativeIndexBuildStrategyFactory;
22+
import org.opensearch.knn.index.codec.params.KNN1040ScalarQuantizedVectorsFormatParams;
2123
import org.opensearch.knn.index.codec.params.KNNScalarQuantizedVectorsFormatParams;
2224
import org.opensearch.knn.index.codec.params.KNNVectorsFormatParams;
2325
import org.opensearch.knn.index.engine.KNNEngine;
@@ -89,6 +91,20 @@ private static Map<LuceneVectorsFormatType, Function<KnnVectorsFormatContext, Kn
8991
p.getConfidenceInterval(),
9092
merge.v2()
9193
);
94+
}, LuceneVectorsFormatType.BBQ, ctx -> {
95+
final KNN1040ScalarQuantizedVectorsFormatParams p = new KNN1040ScalarQuantizedVectorsFormatParams(
96+
ctx.getParams(),
97+
ctx.getDefaultMaxConnections(),
98+
ctx.getDefaultBeamWidth()
99+
);
100+
final Tuple<Integer, ExecutorService> merge = getMergeThreadCountAndExecutorService();
101+
return new Lucene104HnswScalarQuantizedVectorsFormat(
102+
p.getBitEncoding(),
103+
p.getMaxConnections(),
104+
p.getBeamWidth(),
105+
merge.v1(),
106+
merge.v2()
107+
);
92108
},
93109
LuceneVectorsFormatType.FLAT,
94110
ctx -> new Lucene104ScalarQuantizedVectorsFormat(Lucene104ScalarQuantizedVectorsFormat.ScalarEncoding.SINGLE_BIT_QUERY_NIBBLE)

src/main/java/org/opensearch/knn/index/codec/LuceneVectorsFormatType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public enum LuceneVectorsFormatType {
3131
*/
3232
SCALAR_QUANTIZED,
3333

34+
/**
35+
* HNSW format with scalar quantization (SQ) and BBQ encoding.
36+
*/
37+
BBQ,
38+
3439
/**
3540
* Flat vector format (e.g., BBQ flat via Lucene).
3641
*/

src/main/java/org/opensearch/knn/index/codec/backward_codecs/BasePerFieldKnnVectorsFormat.java

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import org.opensearch.knn.index.codec.KNN1040BasePerFieldKnnVectorsFormat;
1616
import org.opensearch.knn.index.codec.KNN990Codec.NativeEngines990KnnVectorsFormat;
1717
import org.opensearch.knn.index.codec.nativeindex.NativeIndexBuildStrategyFactory;
18-
import org.opensearch.knn.index.codec.params.KNNBBQVectorsFormatParams;
1918
import org.opensearch.knn.index.codec.params.KNNScalarQuantizedVectorsFormatParams;
2019
import org.opensearch.knn.index.codec.params.KNNVectorsFormatParams;
2120
import org.opensearch.knn.index.engine.KNNEngine;
@@ -51,8 +50,7 @@ public abstract class BasePerFieldKnnVectorsFormat extends PerFieldKnnVectorsFor
5150
private final int defaultBeamWidth;
5251
private final Supplier<KnnVectorsFormat> defaultFormatSupplier;
5352
private final Function<KNNVectorsFormatParams, KnnVectorsFormat> vectorsFormatSupplier;
54-
private final final Function<KNNScalarQuantizedVectorsFormatParams, KnnVectorsFormat> scalarQuantizedVectorsFormatSupplier;
55-
private final Function<KNNBBQVectorsFormatParams, KnnVectorsFormat> bbqVectorsFormatSupplier;
53+
private final Function<KNNScalarQuantizedVectorsFormatParams, KnnVectorsFormat> scalarQuantizedVectorsFormatSupplier;
5654
private final NativeIndexBuildStrategyFactory nativeIndexBuildStrategyFactory;
5755
private static final String MAX_CONNECTIONS = "max_connections";
5856
private static final String BEAM_WIDTH = "beam_width";
@@ -64,7 +62,7 @@ public BasePerFieldKnnVectorsFormat(
6462
Supplier<KnnVectorsFormat> defaultFormatSupplier,
6563
Function<KNNVectorsFormatParams, KnnVectorsFormat> vectorsFormatSupplier
6664
) {
67-
this(mapperService, defaultMaxConnections, defaultBeamWidth, defaultFormatSupplier, vectorsFormatSupplier, null, null);
65+
this(mapperService, defaultMaxConnections, defaultBeamWidth, defaultFormatSupplier, vectorsFormatSupplier, null);
6866
}
6967

7068
public BasePerFieldKnnVectorsFormat(
@@ -73,8 +71,7 @@ public BasePerFieldKnnVectorsFormat(
7371
int defaultBeamWidth,
7472
Supplier<KnnVectorsFormat> defaultFormatSupplier,
7573
Function<KNNVectorsFormatParams, KnnVectorsFormat> vectorsFormatSupplier,
76-
Function<KNNScalarQuantizedVectorsFormatParams, KnnVectorsFormat> scalarQuantizedVectorsFormatSupplier,
77-
Function<KNNBBQVectorsFormatParams, KnnVectorsFormat> bbqVectorsFormatSupplier
74+
Function<KNNScalarQuantizedVectorsFormatParams, KnnVectorsFormat> scalarQuantizedVectorsFormatSupplier
7875
) {
7976
this(
8077
mapperService,
@@ -83,7 +80,6 @@ public BasePerFieldKnnVectorsFormat(
8380
defaultFormatSupplier,
8481
vectorsFormatSupplier,
8582
scalarQuantizedVectorsFormatSupplier,
86-
bbqVectorsFormatSupplier,
8783
new NativeIndexBuildStrategyFactory()
8884
);
8985
}
@@ -120,27 +116,14 @@ public KnnVectorsFormat getKnnVectorsFormatForField(final String field) {
120116

121117
if (engine == KNNEngine.LUCENE) {
122118
if (params != null && params.containsKey(METHOD_ENCODER_PARAMETER)) {
123-
KNNBBQVectorsFormatParams bbqParams = new KNNBBQVectorsFormatParams(params, defaultMaxConnections, defaultBeamWidth);
124-
if (bbqParams.validate(params)) {
125-
log.debug(
126-
"Initialize KNN vector format for field [{}] with binary quantization, params [{}] = \"{}\", [{}] = \"{}\"",
127-
field,
128-
MAX_CONNECTIONS,
129-
bbqParams.getMaxConnections(),
130-
BEAM_WIDTH,
131-
bbqParams.getBeamWidth()
132-
);
133-
return bbqVectorsFormatSupplier.apply(bbqParams);
134-
}
135-
136119
KNNScalarQuantizedVectorsFormatParams knnScalarQuantizedVectorsFormatParams = new KNNScalarQuantizedVectorsFormatParams(
137120
params,
138121
defaultMaxConnections,
139122
defaultBeamWidth
140123
);
141124
if (knnScalarQuantizedVectorsFormatParams.validate(params)) {
142125
log.debug(
143-
"Initialize KNN vector format for field [{}] with scalar quantization, params [{}] = \"{}\", [{}] = \"{}\", [{}] = \"{}\", [{}] = \"{}\"",
126+
"Initialize KNN vector format for field [{}] with params [{}] = \"{}\", [{}] = \"{}\", [{}] = \"{}\", [{}] = \"{}\"",
144127
field,
145128
MAX_CONNECTIONS,
146129
knnScalarQuantizedVectorsFormatParams.getMaxConnections(),

src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN9120Codec/KNN9120PerFieldKnnVectorsFormat.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,6 @@ public KNN9120PerFieldKnnVectorsFormat(
7777
mergeThreadCountAndExecutorService.v2()
7878
);
7979
},
80-
knnBBQVectorsFormatParams -> {
81-
final Tuple<Integer, ExecutorService> mergeThreadCountAndExecutorService = getMergeThreadCountAndExecutorService();
82-
return new Lucene102HnswBinaryQuantizedVectorsFormat(
83-
knnBBQVectorsFormatParams.getMaxConnections(),
84-
knnBBQVectorsFormatParams.getBeamWidth(),
85-
mergeThreadCountAndExecutorService.v1(),
86-
mergeThreadCountAndExecutorService.v2()
87-
);
88-
},
8980
nativeIndexBuildStrategyFactory
9081
);
9182
}

src/main/java/org/opensearch/knn/index/codec/backward_codecs/KNN990Codec/KNN990PerFieldKnnVectorsFormat.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@ public KNN990PerFieldKnnVectorsFormat(final Optional<MapperService> mapperServic
3737
knnScalarQuantizedVectorsFormatParams.isCompressFlag(),
3838
knnScalarQuantizedVectorsFormatParams.getConfidenceInterval(),
3939
null
40-
),
41-
knnBBQVectorsFormatParams -> new Lucene102HnswBinaryQuantizedVectorsFormat(
42-
knnBBQVectorsFormatParams.getMaxConnections(),
43-
knnBBQVectorsFormatParams.getBeamWidth(),
44-
NUM_MERGE_WORKERS,
45-
null
4640
)
4741
);
4842
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.knn.index.codec.params;
7+
8+
import lombok.Getter;
9+
import org.apache.lucene.codecs.lucene104.Lucene104ScalarQuantizedVectorsFormat.ScalarEncoding;
10+
import org.opensearch.knn.index.engine.MethodComponentContext;
11+
12+
import java.util.Map;
13+
import java.util.Set;
14+
15+
import static org.opensearch.knn.common.KNNConstants.ENCODER_BBQ;
16+
import static org.opensearch.knn.common.KNNConstants.LUCENE_BBQ_BITS;
17+
import static org.opensearch.knn.common.KNNConstants.LUCENE_BBQ_DEFAULT_BITS;
18+
import static org.opensearch.knn.common.KNNConstants.METHOD_ENCODER_PARAMETER;
19+
20+
/**
21+
* Class provides params for Lucene104HnswScalarQuantizedVectorsFormat
22+
*/
23+
@Getter
24+
public class KNN1040ScalarQuantizedVectorsFormatParams extends KNNVectorsFormatParams {
25+
private static final Set<String> SUPPORTED_ENCODERS = Set.of(ENCODER_BBQ);
26+
private String encoderName;
27+
private ScalarEncoding bitEncoding;
28+
29+
public KNN1040ScalarQuantizedVectorsFormatParams(Map<String, Object> params, int defaultMaxConnections, int defaultBeamWidth) {
30+
super(params, defaultMaxConnections, defaultBeamWidth);
31+
MethodComponentContext encoderMethodComponentContext = (MethodComponentContext) params.get(METHOD_ENCODER_PARAMETER);
32+
Map<String, Object> encoderParams = encoderMethodComponentContext.getParameters();
33+
this.encoderName = this.resolveEncoderName(params);
34+
if (this.encoderName != null) this.initBits(encoderParams);
35+
}
36+
37+
private String resolveEncoderName(Map<String, Object> params) {
38+
if (params.get(METHOD_ENCODER_PARAMETER) == null) {
39+
return null;
40+
}
41+
42+
if ((params.get(METHOD_ENCODER_PARAMETER) instanceof MethodComponentContext) == false) {
43+
return null;
44+
}
45+
46+
MethodComponentContext encoderMethodComponentContext = (MethodComponentContext) params.get(METHOD_ENCODER_PARAMETER);
47+
return encoderMethodComponentContext.getName();
48+
}
49+
50+
@Override
51+
public boolean validate(final Map<String, Object> params) {
52+
return encoderName != null && SUPPORTED_ENCODERS.contains(encoderName);
53+
}
54+
55+
private ScalarEncoding getOrDefaultBitsForEncoder(final Map<String, Object> params, String bitsKey, int defaultBits) {
56+
if (params != null && params.containsKey(bitsKey)) {
57+
return ScalarEncoding.fromNumBits((int) params.get(bitsKey));
58+
}
59+
return ScalarEncoding.fromNumBits(defaultBits);
60+
}
61+
62+
private void initBits(final Map<String, Object> params) {
63+
this.bitEncoding = getOrDefaultBitsForEncoder(params, LUCENE_BBQ_BITS, LUCENE_BBQ_DEFAULT_BITS);
64+
}
65+
}

0 commit comments

Comments
 (0)