docstr: Creates an index for the dataset.
  
  If `columns_to_index` is None, all columns are indexed. Otherwise, only the columns in `columns_to_index` are
  used for indexing, but all columns in `df` are returned in the search results.
code: def create_dataset_index(
      self,
      df: pd.DataFrame,
      backend: "Backend",
      columns_to_index: Optional[List[str]] = None,
  ):
      """Creates an index for the dataset.
  
      If `columns_to_index` is None, all columns are indexed. Otherwise, only the columns in `columns_to_index` are
      used for indexing, but all columns in `df` are returned in the search results.
      """
      pass
  
imports: import hashlib
  import json
  import os
  from abc import ABC, abstractmethod
  from typing import Any, Callable, Dict, List, Optional, Type, TYPE_CHECKING, Union
  import numpy
  import pandas
  from tqdm import tqdm
  from ludwig.vector_index import FAISS, get_vector_index_cls
  from ludwig.vector_index.base import VectorIndex
  from ludwig.utils.batch_size_tuner import BatchSizeEvaluator
  from ludwig.utils.torch_utils import get_torch_device
label_desc: Use image node_id 1 for calling the RetrievalModel obj's underlying member method code with example usage: obj.create_dataset_index(df, backend, columns_to_index) without return types