From d1480d778b44ea91fde33796f3badcfd9638beab Mon Sep 17 00:00:00 2001 From: Vijayan Balasubramanian Date: Fri, 6 Dec 2024 22:33:42 -0800 Subject: [PATCH] Add bwc test for model id This is applicable for index created before 2.17 Signed-off-by: Vijayan Balasubramanian --- qa/restart-upgrade/build.gradle | 13 +++++ .../java/org/opensearch/knn/bwc/ModelIT.java | 55 +++++++++++++++++++ .../org/opensearch/knn/KNNRestTestCase.java | 16 ------ 3 files changed, 68 insertions(+), 16 deletions(-) diff --git a/qa/restart-upgrade/build.gradle b/qa/restart-upgrade/build.gradle index 628b62352a..459954c26e 100644 --- a/qa/restart-upgrade/build.gradle +++ b/qa/restart-upgrade/build.gradle @@ -96,6 +96,12 @@ testClusters { excludeTestsMatching "org.opensearch.knn.bwc.IndexingIT.testKNNIndexLuceneForceMerge" } } + if (!(knn_bwc_version.startsWith("2.15.") || + knn_bwc_version.startsWith("2.16."))){ + filter { + excludeTestsMatching "org.opensearch.knn.bwc.ModelIT.testNonKNNIndex_withModelId" + } + } nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}") nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}") @@ -170,6 +176,13 @@ testClusters { } } + if (!(knn_bwc_version.startsWith("2.15.") || + knn_bwc_version.startsWith("2.16."))){ + filter { + excludeTestsMatching "org.opensearch.knn.bwc.ModelIT.testNonKNNIndex_withModelId" + } + } + nonInputProperties.systemProperty('tests.rest.cluster', "${-> testClusters."${baseName}".allHttpSocketURI.join(",")}") nonInputProperties.systemProperty('tests.clustername', "${-> testClusters."${baseName}".getName()}") systemProperty 'tests.security.manager', 'false' diff --git a/qa/restart-upgrade/src/test/java/org/opensearch/knn/bwc/ModelIT.java b/qa/restart-upgrade/src/test/java/org/opensearch/knn/bwc/ModelIT.java index c2bcdbf83c..566625a9d1 100644 --- a/qa/restart-upgrade/src/test/java/org/opensearch/knn/bwc/ModelIT.java +++ b/qa/restart-upgrade/src/test/java/org/opensearch/knn/bwc/ModelIT.java @@ -41,26 +41,32 @@ public class ModelIT extends AbstractRestartUpgradeTestCase { private static final String TEST_MODEL_INDEX = KNN_BWC_PREFIX + "test-model-index"; private static final String TEST_MODEL_INDEX_DEFAULT = KNN_BWC_PREFIX + "test-model-index-default"; + private static final String TEST_MODEL_INDEX_FOR_NON_KNN_INDEX = KNN_BWC_PREFIX + "test-model-index-for-non-knn-index"; private static final String TRAINING_INDEX = KNN_BWC_PREFIX + "train-index"; private static final String TRAINING_INDEX_DEFAULT = KNN_BWC_PREFIX + "train-index-default"; + private static final String TRAINING_INDEX_FOR_NON_KNN_INDEX = KNN_BWC_PREFIX + "train-index-for-non-knn-index"; private static final String TRAINING_FIELD = "train-field"; private static final String TEST_FIELD = "test-field"; private static final int DIMENSIONS = 5; private static int DOC_ID = 0; private static int DOC_ID_TEST_MODEL_INDEX = 0; private static int DOC_ID_TEST_MODEL_INDEX_DEFAULT = 0; + private static int DOC_ID_TEST_MODEL_INDEX_FOR_NON_KNN_INDEX = 0; private static final int DELAY_MILLI_SEC = 1000; private static final int EXP_NUM_OF_MODELS = 2; private static final int K = 5; private static final int NUM_DOCS = 10; private static final int NUM_DOCS_TEST_MODEL_INDEX = 100; private static final int NUM_DOCS_TEST_MODEL_INDEX_DEFAULT = 100; + private static final int NUM_DOCS_TEST_MODEL_INDEX_FOR_NON_KNN_INDEX = 100; private static final int NUM_OF_ATTEMPTS = 30; private static int QUERY_COUNT = 0; private static int QUERY_COUNT_TEST_MODEL_INDEX = 0; private static int QUERY_COUNT_TEST_MODEL_INDEX_DEFAULT = 0; + private static int QUERY_COUNT_TEST_MODEL_INDEX_FOR_NON_KNN_INDEX = 0; private static final String TEST_MODEL_ID = "test-model-id"; private static final String TEST_MODEL_ID_DEFAULT = "test-model-id-default"; + private static final String TEST_MODEL_ID_FOR_NON_KNN_INDEX = "test-model-id-for-non-knn-index"; private static final String MODEL_DESCRIPTION = "Description for train model test"; // KNN model test @@ -135,6 +141,55 @@ public void testKNNModelDefault() throws Exception { } } + public void testNonKNNIndex_withModelId() throws Exception { + if (isRunningAgainstOldCluster()) { + + // Create a training index and randomly ingest data into it + createBasicKnnIndex(TRAINING_INDEX_FOR_NON_KNN_INDEX, TRAINING_FIELD, DIMENSIONS); + bulkIngestRandomVectors(TRAINING_INDEX_FOR_NON_KNN_INDEX, TRAINING_FIELD, NUM_DOCS, DIMENSIONS); + + trainKNNModel(TEST_MODEL_ID_FOR_NON_KNN_INDEX, TRAINING_INDEX_FOR_NON_KNN_INDEX, TRAINING_FIELD, DIMENSIONS, MODEL_DESCRIPTION); + validateModelCreated(TEST_MODEL_ID_FOR_NON_KNN_INDEX); + + createKnnIndex( + testIndex, + createKNNDefaultScriptScoreSettings(), + modelIndexMapping(TEST_FIELD, TEST_MODEL_ID_FOR_NON_KNN_INDEX) + ); + addKNNDocs(testIndex, TEST_FIELD, DIMENSIONS, DOC_ID, NUM_DOCS); + } else { + Thread.sleep(1000); + DOC_ID = NUM_DOCS; + addKNNDocs(testIndex, TEST_FIELD, DIMENSIONS, DOC_ID, NUM_DOCS); + QUERY_COUNT = 2 * NUM_DOCS; + validateKNNSearch(testIndex, TEST_FIELD, DIMENSIONS, QUERY_COUNT, K); + + searchKNNModel(TEST_MODEL_ID_FOR_NON_KNN_INDEX); + + createKnnIndex(TEST_MODEL_INDEX_FOR_NON_KNN_INDEX, modelIndexMapping(TEST_FIELD, TEST_MODEL_ID_FOR_NON_KNN_INDEX)); + addKNNDocs( + TEST_MODEL_INDEX_FOR_NON_KNN_INDEX, + TEST_FIELD, + DIMENSIONS, + DOC_ID_TEST_MODEL_INDEX_FOR_NON_KNN_INDEX, + NUM_DOCS_TEST_MODEL_INDEX_FOR_NON_KNN_INDEX + ); + QUERY_COUNT_TEST_MODEL_INDEX_FOR_NON_KNN_INDEX = NUM_DOCS_TEST_MODEL_INDEX_FOR_NON_KNN_INDEX; + validateKNNSearch( + TEST_MODEL_INDEX_FOR_NON_KNN_INDEX, + TEST_FIELD, + DIMENSIONS, + QUERY_COUNT_TEST_MODEL_INDEX_FOR_NON_KNN_INDEX, + K + ); + + deleteKNNIndex(testIndex); + deleteKNNIndex(TRAINING_INDEX_FOR_NON_KNN_INDEX); + deleteKNNIndex(TEST_MODEL_INDEX_FOR_NON_KNN_INDEX); + deleteKNNModel(TEST_MODEL_INDEX_FOR_NON_KNN_INDEX); + } + } + // Delete Models and ".opensearch-knn-models" index to clear cluster metadata @AfterClass public static void wipeAllModels() throws IOException { diff --git a/src/testFixtures/java/org/opensearch/knn/KNNRestTestCase.java b/src/testFixtures/java/org/opensearch/knn/KNNRestTestCase.java index cc575aa026..2afbd9639a 100644 --- a/src/testFixtures/java/org/opensearch/knn/KNNRestTestCase.java +++ b/src/testFixtures/java/org/opensearch/knn/KNNRestTestCase.java @@ -396,22 +396,6 @@ protected String createKnnIndexMapping(String fieldName, Integer dimensions) thr .toString(); } - /** - * Utility to create a Knn Index Mapping with model id - */ - protected String createKnnIndexMapping(String fieldName, String modelId) throws IOException { - return XContentFactory.jsonBuilder() - .startObject() - .startObject("properties") - .startObject(fieldName) - .field("type", "knn_vector") - .field("model_id", modelId) - .endObject() - .endObject() - .endObject() - .toString(); - } - protected String createKnnIndexMapping(final String fieldName, final Integer dimensions, final VectorDataType vectorDataType) throws IOException { return XContentFactory.jsonBuilder()