-
Notifications
You must be signed in to change notification settings - Fork 128
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Lucene 9.5 codec and make it new default #700
Changes from 1 commit
10c6a2c
656b549
fdff360
6228d5d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package org.opensearch.knn.index.codec.KNN950Codec; | ||
|
||
import lombok.Builder; | ||
import org.apache.lucene.codecs.Codec; | ||
import org.apache.lucene.codecs.CompoundFormat; | ||
import org.apache.lucene.codecs.DocValuesFormat; | ||
import org.apache.lucene.codecs.FilterCodec; | ||
import org.apache.lucene.codecs.KnnVectorsFormat; | ||
import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; | ||
import org.opensearch.knn.index.codec.KNNCodecVersion; | ||
import org.opensearch.knn.index.codec.KNNFormatFacade; | ||
|
||
public class KNN950Codec extends FilterCodec { | ||
private static final KNNCodecVersion VERSION = KNNCodecVersion.V_9_5_0; | ||
private final KNNFormatFacade knnFormatFacade; | ||
private final PerFieldKnnVectorsFormat perFieldKnnVectorsFormat; | ||
|
||
/** | ||
* No arg constructor that uses Lucene95 as the delegate | ||
*/ | ||
public KNN950Codec() { | ||
this(VERSION.getDefaultCodecDelegate(), VERSION.getPerFieldKnnVectorsFormat()); | ||
} | ||
|
||
/** | ||
* Sole constructor. When subclassing this codec, create a no-arg ctor and pass the delegate codec | ||
* and a unique name to this ctor. | ||
* | ||
* @param delegate codec that will perform all operations this codec does not override | ||
* @param knnVectorsFormat per field format for KnnVector | ||
*/ | ||
@Builder | ||
protected KNN950Codec(Codec delegate, PerFieldKnnVectorsFormat knnVectorsFormat) { | ||
super(VERSION.getCodecName(), delegate); | ||
knnFormatFacade = VERSION.getKnnFormatFacadeSupplier().apply(delegate); | ||
perFieldKnnVectorsFormat = knnVectorsFormat; | ||
} | ||
|
||
@Override | ||
public DocValuesFormat docValuesFormat() { | ||
return knnFormatFacade.docValuesFormat(); | ||
} | ||
|
||
@Override | ||
public CompoundFormat compoundFormat() { | ||
return knnFormatFacade.compoundFormat(); | ||
} | ||
|
||
@Override | ||
public KnnVectorsFormat knnVectorsFormat() { | ||
return perFieldKnnVectorsFormat; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package org.opensearch.knn.index.codec.KNN950Codec; | ||
|
||
import org.apache.lucene.codecs.lucene95.Lucene95HnswVectorsFormat; | ||
import org.opensearch.index.mapper.MapperService; | ||
import org.opensearch.knn.index.codec.BasePerFieldKnnVectorsFormat; | ||
|
||
import java.util.Optional; | ||
|
||
/** | ||
* Class provides per field format implementation for Lucene Knn vector type | ||
*/ | ||
public class KNN950PerFieldKnnVectorsFormat extends BasePerFieldKnnVectorsFormat { | ||
|
||
public KNN950PerFieldKnnVectorsFormat(final Optional<MapperService> mapperService) { | ||
super( | ||
mapperService, | ||
Lucene95HnswVectorsFormat.DEFAULT_MAX_CONN, | ||
Lucene95HnswVectorsFormat.DEFAULT_BEAM_WIDTH, | ||
() -> new Lucene95HnswVectorsFormat(), | ||
(maxConnm, beamWidth) -> new Lucene95HnswVectorsFormat(maxConnm, beamWidth) | ||
); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,6 +11,7 @@ | |
import org.apache.lucene.backward_codecs.lucene92.Lucene92Codec; | ||
import org.apache.lucene.backward_codecs.lucene94.Lucene94Codec; | ||
import org.apache.lucene.codecs.Codec; | ||
import org.apache.lucene.codecs.lucene95.Lucene95Codec; | ||
import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; | ||
import org.opensearch.index.mapper.MapperService; | ||
import org.opensearch.knn.index.codec.KNN80Codec.KNN80CompoundFormat; | ||
|
@@ -20,6 +21,8 @@ | |
import org.opensearch.knn.index.codec.KNN920Codec.KNN920PerFieldKnnVectorsFormat; | ||
import org.opensearch.knn.index.codec.KNN940Codec.KNN940Codec; | ||
import org.opensearch.knn.index.codec.KNN940Codec.KNN940PerFieldKnnVectorsFormat; | ||
import org.opensearch.knn.index.codec.KNN950Codec.KNN950Codec; | ||
import org.opensearch.knn.index.codec.KNN950Codec.KNN950PerFieldKnnVectorsFormat; | ||
|
||
import java.util.Optional; | ||
import java.util.function.BiFunction; | ||
|
@@ -74,9 +77,24 @@ public enum KNNCodecVersion { | |
.knnVectorsFormat(new KNN940PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService))) | ||
.build(), | ||
KNN940Codec::new | ||
), | ||
|
||
V_9_5_0( | ||
"KNN950Codec", | ||
new Lucene95Codec(), | ||
new KNN950PerFieldKnnVectorsFormat(Optional.empty()), | ||
(delegate) -> new KNNFormatFacade( | ||
new KNN80DocValuesFormat(delegate.docValuesFormat()), | ||
new KNN80CompoundFormat(delegate.compoundFormat()) | ||
), | ||
(userCodec, mapperService) -> KNN940Codec.builder() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this supposed to be 95? KNN940Codec There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. oh yes, my bad, correcting it now |
||
.delegate(userCodec) | ||
.knnVectorsFormat(new KNN950PerFieldKnnVectorsFormat(Optional.ofNullable(mapperService))) | ||
.build(), | ||
KNN950Codec::new | ||
); | ||
|
||
private static final KNNCodecVersion CURRENT = V_9_4_0; | ||
private static final KNNCodecVersion CURRENT = V_9_5_0; | ||
|
||
private final String codecName; | ||
private final Codec defaultCodecDelegate; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* | ||
* Copyright OpenSearch Contributors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package org.opensearch.knn.index.codec.KNN950Codec; | ||
|
||
import org.apache.lucene.codecs.Codec; | ||
import org.apache.lucene.codecs.perfield.PerFieldKnnVectorsFormat; | ||
import org.opensearch.index.mapper.MapperService; | ||
import org.opensearch.knn.index.codec.KNNCodecTestCase; | ||
|
||
import java.io.IOException; | ||
import java.util.Optional; | ||
import java.util.concurrent.ExecutionException; | ||
import java.util.function.Function; | ||
|
||
import static org.opensearch.knn.index.codec.KNNCodecVersion.V_9_5_0; | ||
|
||
public class KNN950CodecTests extends KNNCodecTestCase { | ||
|
||
public void testMultiFieldsKnnIndex() throws Exception { | ||
testMultiFieldsKnnIndex(KNN950Codec.builder().delegate(V_9_5_0.getDefaultCodecDelegate()).build()); | ||
} | ||
|
||
public void testBuildFromModelTemplate() throws InterruptedException, ExecutionException, IOException { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. see if you want to use @SneakyThrows to remove these exceptions from method signature. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. oh, nice advise, let me replace list of exceptions with a sneakythrows |
||
testBuildFromModelTemplate((KNN950Codec.builder().delegate(V_9_5_0.getDefaultCodecDelegate()).build())); | ||
} | ||
|
||
public void testKnnVectorIndex() throws Exception { | ||
Function<MapperService, PerFieldKnnVectorsFormat> perFieldKnnVectorsFormatProvider = ( | ||
mapperService) -> new KNN950PerFieldKnnVectorsFormat(Optional.of(mapperService)); | ||
|
||
Function<PerFieldKnnVectorsFormat, Codec> knnCodecProvider = (knnVectorFormat) -> KNN950Codec.builder() | ||
.delegate(V_9_5_0.getDefaultCodecDelegate()) | ||
.knnVectorsFormat(knnVectorFormat) | ||
.build(); | ||
|
||
testKnnVectorIndex(knnCodecProvider, perFieldKnnVectorsFormatProvider); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[Question]: The other enums which are present in the like V_9_4_0, are they getting used somewhere? if not lets remove them.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
they are referenced from codec classes, like here. So if we keep older codecs we also need that other enum members.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For clarification - in enum we do have only codec versions starting from 9.1 (9.1.0, 9.2.0, 9.4.0). There are no references for older codecs, so it's not a problem if we decide to drop them in future to be consistent with what core OS supports.