Skip to content
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
* Use pre-quantized vectors from native engines for exact search [#3095](https://github.com/opensearch-project/k-NN/pull/3095)
* Use right Vector Scorer when segments are initialized using SPI and also corrected the maxConn for MOS [#3117](https://github.com/opensearch-project/k-NN/pull/3117)
* Use pre-quantized vectors for ADC [#3113](https://github.com/opensearch-project/k-NN/pull/3113)
* Adjusting the merge policy setting to make merges less aggressive [#3128](https://github.com/opensearch-project/k-NN/pull/3128)
* Upgrade Lucene to 10.4.0 [#3135](https://github.com/opensearch-project/k-NN/pull/3135)

16 changes: 15 additions & 1 deletion src/main/java/org/opensearch/knn/plugin/KNNPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@
import org.opensearch.core.action.ActionResponse;
import org.opensearch.core.common.io.stream.NamedWriteableRegistry;
import org.opensearch.core.common.settings.SecureString;
import org.opensearch.core.common.unit.ByteSizeUnit;
import org.opensearch.core.common.unit.ByteSizeValue;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.env.Environment;
import org.opensearch.env.NodeEnvironment;
import org.opensearch.index.IndexModule;
import org.opensearch.index.IndexSettings;
import org.opensearch.index.TieredMergePolicyProvider;
import org.opensearch.index.codec.CodecServiceFactory;
import org.opensearch.index.engine.EngineFactory;
import org.opensearch.index.mapper.Mapper;
Expand Down Expand Up @@ -284,7 +287,18 @@ public Collection<IndexSettingProvider> getAdditionalIndexSettingProviders() {
@Override
public Settings getAdditionalIndexSettings(String indexName, boolean isDataStreamIndex, Settings templateAndRequestSettings) {
if (templateAndRequestSettings.getAsBoolean(KNNSettings.KNN_INDEX, false)) {
return Settings.builder().put(KNN_DERIVED_SOURCE_ENABLED, true).build();
return Settings.builder()
.put(KNN_DERIVED_SOURCE_ENABLED, true)
// Aggressive merges for k-NN can hogg CPU which can degrade search performance
// These settings are being overridden to make it less aggressive
// Core has max_merge_at_once default as 30, which can make merges more aggressive
.put(TieredMergePolicyProvider.INDEX_MERGE_POLICY_MAX_MERGE_AT_ONCE_SETTING.getKey(), 10)
// Core has max_merge_at_once default as 16MB, which can make merges more aggressive
.put(
TieredMergePolicyProvider.INDEX_MERGE_POLICY_FLOOR_SEGMENT_SETTING.getKey(),
new ByteSizeValue(2, ByteSizeUnit.MB)
)
.build();
}
return Settings.EMPTY;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.knn.index;

import org.opensearch.index.TieredMergePolicyProvider;
import org.opensearch.knn.KNNRestTestCase;
import org.opensearch.common.settings.Settings;

import static org.opensearch.knn.index.KNNSettings.KNN_DERIVED_SOURCE_ENABLED;

public class DefaultKNNIndexSettingsIT extends KNNRestTestCase {

public void testKnnIndexSettings_whenisKNN_thenOverride() throws Exception {
String indexName = randomLowerCaseString();
String fieldName = randomLowerCaseString();
boolean isKnnIndex = randomBoolean();

Settings indexSettings = Settings.builder().put("index.knn", isKnnIndex).build();

if (isKnnIndex) {
String mapping = createKnnIndexMapping(fieldName, 128);
createKnnIndex(indexName, indexSettings, mapping);
} else {
createIndex(indexName, indexSettings);
}

// Verify settings based on knn flag
String derivedSourceEnabled = getIndexSettingByName(indexName, KNN_DERIVED_SOURCE_ENABLED);
assertEquals(Boolean.toString(isKnnIndex), derivedSourceEnabled);

String maxMergeAtOnce = getIndexSettingByName(
indexName,
TieredMergePolicyProvider.INDEX_MERGE_POLICY_MAX_MERGE_AT_ONCE_SETTING.getKey(),
!isKnnIndex
);
String floorSegment = getIndexSettingByName(
indexName,
TieredMergePolicyProvider.INDEX_MERGE_POLICY_FLOOR_SEGMENT_SETTING.getKey(),
!isKnnIndex
);

if (isKnnIndex) {
assertEquals("10", maxMergeAtOnce);
assertEquals("2mb", floorSegment);
} else {
assertNotEquals("10", maxMergeAtOnce);
assertNotEquals("2mb", floorSegment);
}

deleteKNNIndex(indexName);
}
}
Loading