code: func (s *Store) ReIndex(exampleType interface{}, bucketName []byte) error {
  	storer := newStorer(exampleType)
  
  	return s.Bolt().Update(func(tx *bolt.Tx) error {
  		indexes := storer.Indexes()
  		// delete existing indexes
  		// TODO: Remove indexes not specified the storer index list?
  		// good for cleanup, bad for possible side effects
  
  		for indexName := range indexes {
  			err := tx.DeleteBucket(indexBucketName(storer.Type(), indexName))
  			if err != nil && err != bolt.ErrBucketNotFound {
  				return err
  			}
  		}
  
  		copyData := true
  
  		if bucketName == nil {
  			bucketName = []byte(storer.Type())
  			copyData = false
  		}
  
  		c := tx.Bucket(bucketName).Cursor()
  
  		for k, v := c.First(); k != nil; k, v = c.Next() {
  			if copyData {
  				b, err := tx.CreateBucketIfNotExists([]byte(storer.Type()))
  				if err != nil {
  					return err
  				}
  
  				err = b.Put(k, v)
  				if err != nil {
  					return err
  				}
  			}
  			err := decode(v, exampleType)
  			if err != nil {
  				return err
  			}
  			err = indexAdd(storer, tx, k, exampleType)
  			if err != nil {
  				return err
  			}
  		}
  
  		return nil
  	})
  }
docs: // ReIndex removes any existing indexes and adds all the indexes defined by the passed in datatype example
  // This function allows you to index an already existing boltDB file, or refresh any missing indexes
  // if bucketName is nil, then we'll assume a bucketName of storer.Type()
  // if a bucketname is specified, then the data will be copied to the bolthold standard bucket of storer.Type()