docstr: Creates a vector index using the provided expr on the table.
  This feature directly works on IMAGE tables.
  For VIDEO tables, the feature should be extracted first and stored in an intermediate table, before creating the index.
  
  Args:
      index_name (str): Name of the index.
      table_name (str): Name of the table.
      expr (str): Expression used to build the vector index.
  
      using (str): Method used for indexing, can be `FAISS` or `QDRANT` or `PINECONE` or `CHROMADB` or `WEAVIATE` or `MILVUS`.
  
  Returns:
      EvaDBCursor: The EvaDBCursor object.
  
  Examples:
      Create a Vector Index using QDRANT
  
      >>> cursor.create_vector_index(
              "faiss_index",
              table_name="meme_images",
              expr="SiftFeatureExtractor(data)",
              using="QDRANT"
          ).df()
                  0
          0       Index faiss_index successfully added to the database
      >>> relation = cursor.table("PDFs")
      >>> relation.order("Similarity(ImageFeatureExtractor(Open('/images/my_meme')), ImageFeatureExtractor(data) ) DESC")
      >>> relation.df()
docstr_tok: ["Creates","a","vector","index","using","the","provided","expr","on","the","table",".","This","feature","directly","works","on","IMAGE","tables",".","For","VIDEO","tables",",","the","feature","should","be","extracted","first","and","stored","in","an","intermediate","table",",","before","creating","the","index",".","Args",":","index_name","(","str",")",":","Name","of","the","index",".","table_name","(","str",")",":","Name","of","the","table",".","expr","(","str",")",":","Expression","used","to","build","the","vector","index",".","using","(","str",")",":","Method","used","for","indexing",",","can","be","`","FAISS","`","or","`","QDRANT","`","or","`","PINECONE","`","or","`","CHROMADB","`","or","`","WEAVIATE","`","or","`","MILVUS","`",".","Returns",":","EvaDBCursor",":","The","EvaDBCursor","object",".","Examples",":","Create","a","Vector","Index","using","QDRANT",">",">",">","cursor.create_vector_index","(","``","faiss_index","''",",","table_name=","''","meme_images","''",",","expr=","''","SiftFeatureExtractor","(","data",")","''",",","using=","''","QDRANT","''",")",".df","(",")","0","0","Index","faiss_index","successfully","added","to","the","database",">",">",">","relation","=","cursor.table","(","``","PDFs","''",")",">",">",">","relation.order","(","``","Similarity","(","ImageFeatureExtractor","(","Open","(","'\/images\/my_meme","'",")",")",",","ImageFeatureExtractor","(","data",")",")","DESC","''",")",">",">",">","relation.df","(",")"]
code: def create_vector_index(
      self, index_name: str, table_name: str, expr: str, using: str
  ) -> "EvaDBCursor":
      """
      Creates a vector index using the provided expr on the table.
      This feature directly works on IMAGE tables.
      For VIDEO tables, the feature should be extracted first and stored in an intermediate table, before creating the index.
  
      Args:
          index_name (str): Name of the index.
          table_name (str): Name of the table.
          expr (str): Expression used to build the vector index.
  
          using (str): Method used for indexing, can be `FAISS` or `QDRANT` or `PINECONE` or `CHROMADB` or `WEAVIATE` or `MILVUS`.
  
      Returns:
          EvaDBCursor: The EvaDBCursor object.
  
      Examples:
          Create a Vector Index using QDRANT
  
          >>> cursor.create_vector_index(
                  "faiss_index",
                  table_name="meme_images",
                  expr="SiftFeatureExtractor(data)",
                  using="QDRANT"
              ).df()
                      0
              0	Index faiss_index successfully added to the database
          >>> relation = cursor.table("PDFs")
          >>> relation.order("Similarity(ImageFeatureExtractor(Open('/images/my_meme')), ImageFeatureExtractor(data) ) DESC")
          >>> relation.df()
  
  
      """
      stmt = parse_create_vector_index(
          index_name, table_name, expr, using
      )
      # TODO: move create_vector_index into EvaDBQuery.
      self._result = execute_statement(self._evadb, stmt)
      return self
  
imports: import asyncio
  import multiprocessing
  import pandas
  from evadb.configuration.constants import EvaDB_DATABASE_DIR
  from evadb.database import EvaDBDatabase, init_evadb_instance
  from evadb.expression.tuple_value_expression import TupleValueExpression
  from evadb.functions.function_bootstrap_queries import init_builtin_functions
  from evadb.interfaces.relational.relation import EvaDBQuery
  from evadb.interfaces.relational.utils import try_binding
  from evadb.models.server.response import Response
  from evadb.models.storage.batch import Batch
  from evadb.parser.alias import Alias
  from evadb.parser.select_statement import SelectStatement
  from evadb.parser.utils import parse_create_function, parse_create_table, parse_create_vector_index, parse_drop_function, parse_drop_index, parse_drop_table, parse_explain, parse_insert, parse_load, parse_query, parse_rename, parse_show, parse_table_clause
  from evadb.server.command_handler import execute_statement
  from evadb.utils.generic_utils import find_nearest_word, is_ray_enabled_and_installed
  from evadb.utils.job_scheduler import JobScheduler
  from evadb.utils.logging_manager import logger
label_desc: Use image node_id 7 for calling the EvaDBCursor obj's underlying member method code with example usage: obj.create_vector_index(index_name, table_name, expr, using) and returns: self