{
  "properties": {
    "apiVersion": {
      "description": "apiVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources",
      "type": "string"
    },
    "kind": {
      "description": "kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "properties": {
        "description": {
          "description": "The description of the Index.",
          "type": "string"
        },
        "displayName": {
          "description": "The display name of the Index. The name can be up to 128 characters long and can consist of any UTF-8 characters.",
          "type": "string"
        },
        "indexUpdateMethod": {
          "description": "Immutable. The update method to use with this Index. The value must be the followings. If not set, BATCH_UPDATE will be used by default.\n* BATCH_UPDATE: user can call indexes.patch with files on Cloud Storage of datapoints to update.\n* STREAM_UPDATE: user can call indexes.upsertDatapoints/DeleteDatapoints to update the Index and the updates will be applied in corresponding DeployedIndexes in nearly real-time.",
          "type": "string"
        },
        "metadata": {
          "description": "An additional information about the Index.",
          "properties": {
            "config": {
              "description": "Immutable. The configuration of the Matching Engine Index.",
              "properties": {
                "algorithmConfig": {
                  "description": "The configuration with regard to the algorithms used for efficient search.",
                  "properties": {
                    "bruteForceConfig": {
                      "description": "Configuration options for using brute force search, which simply implements the\nstandard linear search in the database for each query.",
                      "type": "object"
                    },
                    "treeAhConfig": {
                      "description": "Configuration options for using the tree-AH algorithm (Shallow tree + Asymmetric Hashing).\nPlease refer to this paper for more details: https://arxiv.org/abs/1908.10396.",
                      "properties": {
                        "leafNodeEmbeddingCount": {
                          "description": "Number of embeddings on each leaf node. The default value is 1000 if not set.",
                          "type": "integer"
                        },
                        "leafNodesToSearchPercent": {
                          "description": "The default percentage of leaf nodes that any query may be searched. Must be in\nrange 1-100, inclusive. The default value is 10 (means 10%) if not set.",
                          "type": "integer"
                        }
                      },
                      "type": "object",
                      "additionalProperties": false
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "approximateNeighborsCount": {
                  "description": "The default number of neighbors to find via approximate search before exact reordering is\nperformed. Exact reordering is a procedure where results returned by an\napproximate search algorithm are reordered via a more expensive distance computation.\nRequired if tree-AH algorithm is used.",
                  "type": "integer"
                },
                "dimensions": {
                  "description": "The number of dimensions of the input vectors.",
                  "type": "integer"
                },
                "distanceMeasureType": {
                  "description": "The distance measure used in nearest neighbor search. The value must be one of the followings:\n* SQUARED_L2_DISTANCE: Euclidean (L_2) Distance\n* L1_DISTANCE: Manhattan (L_1) Distance\n* COSINE_DISTANCE: Cosine Distance. Defined as 1 - cosine similarity.\n* DOT_PRODUCT_DISTANCE: Dot Product Distance. Defined as a negative of the dot product.",
                  "type": "string"
                },
                "featureNormType": {
                  "description": "Type of normalization to be carried out on each vector. The value must be one of the followings:\n* UNIT_L2_NORM: Unit L2 normalization type\n* NONE: No normalization type is specified.",
                  "type": "string"
                },
                "shardSize": {
                  "description": "Immutable. Index data is split into equal parts to be processed. These are called \"shards\".\nThe shard size must be specified when creating an index. The value must be one of the followings:\n* SHARD_SIZE_SMALL: Small (2GB)\n* SHARD_SIZE_MEDIUM: Medium (20GB)\n* SHARD_SIZE_LARGE: Large (50GB).",
                  "type": "string"
                }
              },
              "required": [
                "dimensions"
              ],
              "type": "object",
              "additionalProperties": false
            },
            "contentsDeltaUri": {
              "description": "Allows creating or replacing the contents of the Matching Engine Index.\nWhen being updated, the existing content of the Index will be replaced by the data\nfrom the latest contentsDeltaUri.\nThe string must be a valid Cloud Storage directory path. If this\nfield is set when calling IndexService.UpdateIndex, then no other\nIndex field can be also updated as part of the same call.\nThe expected structure and format of the files this URI points to is\ndescribed at https://cloud.google.com/vertex-ai/docs/matching-engine/using-matching-engine#input-data-format.",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "projectRef": {
          "description": "The project that this resource belongs to.",
          "oneOf": [
            {
              "not": {
                "required": [
                  "external"
                ]
              },
              "required": [
                "name"
              ]
            },
            {
              "not": {
                "anyOf": [
                  {
                    "required": [
                      "name"
                    ]
                  },
                  {
                    "required": [
                      "namespace"
                    ]
                  }
                ]
              },
              "required": [
                "external"
              ]
            }
          ],
          "properties": {
            "external": {
              "description": "Allowed value: The `name` field of a `Project` resource.",
              "type": "string"
            },
            "name": {
              "description": "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names",
              "type": "string"
            },
            "namespace": {
              "description": "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "region": {
          "description": "Immutable. The region of the index. eg us-central1.",
          "type": "string"
        },
        "resourceID": {
          "description": "Immutable. Optional. The service-generated name of the resource. Used for acquisition only. Leave unset to create a new resource.",
          "type": "string"
        }
      },
      "required": [
        "displayName",
        "projectRef",
        "region"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "properties": {
        "conditions": {
          "description": "Conditions represent the latest available observation of the resource's current state.",
          "items": {
            "properties": {
              "lastTransitionTime": {
                "description": "Last time the condition transitioned from one status to another.",
                "type": "string"
              },
              "message": {
                "description": "Human-readable message indicating details about last transition.",
                "type": "string"
              },
              "reason": {
                "description": "Unique, one-word, CamelCase reason for the condition's last transition.",
                "type": "string"
              },
              "status": {
                "description": "Status is the status of the condition. Can be True, False, Unknown.",
                "type": "string"
              },
              "type": {
                "description": "Type is the type of the condition.",
                "type": "string"
              }
            },
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "observedGeneration": {
          "description": "ObservedGeneration is the generation of the resource that was most recently observed by the Config Connector controller. If this is equal to metadata.generation, then that means that the current reported status reflects the most recent desired state of the resource.",
          "type": "integer"
        },
        "observedState": {
          "description": "The observed state of the underlying GCP resource.",
          "properties": {
            "createTime": {
              "description": "The timestamp of when the Index was created in RFC3339 UTC \"Zulu\" format, with nanosecond resolution and up to nine fractional digits.",
              "type": "string"
            },
            "indexStats": {
              "description": "Stats of the index resource.",
              "items": {
                "properties": {
                  "shardsCount": {
                    "description": "The number of shards in the Index.",
                    "type": "integer"
                  },
                  "vectorsCount": {
                    "description": "The number of vectors in the Index.",
                    "type": "string"
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "metadataSchemaUri": {
              "description": "Points to a YAML file stored on Google Cloud Storage describing additional information about the Index, that is specific to it. Unset if the Index does not have any additional information.",
              "type": "string"
            },
            "name": {
              "description": "The resource name of the Index.",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        }
      },
      "type": "object",
      "additionalProperties": false
    }
  },
  "required": [
    "spec"
  ],
  "type": "object"
}
