code: def neighbours(self, v,
                     distance=None,
                     fetch_vector_filters=None,
                     vector_filters=None):
          
  
          # Collect candidates from all buckets from all hashes
          candidates = self._get_candidates(v)
          # print 'Candidate count is %d' % len(candidates)
  
          # Apply fetch vector filters if specified and return filtered list
          if fetch_vector_filters:
              candidates = self._apply_filter(fetch_vector_filters,
                                              candidates)
  
          # Apply distance implementation if specified
          if not distance:
              distance = self.distance
          candidates = self._append_distances(v, distance, candidates)
  
          # Apply vector filters if specified and return filtered list
          if not vector_filters:
              vector_filters = self.vector_filters
          candidates = self._apply_filter(vector_filters, candidates)
  
          # If there is no vector filter, just return list of candidates
          return candidates
docs: Hashes vector v, collects all candidate vectors from the matching
          buckets in storage, applys the (optional) distance function and
          finally the (optional) filter function to construct the returned list
          of either (vector, data, distance) tuples or (vector, data) tuples.