find method

  1. @override
Future<List<Document>> find({
  1. required List<double> vector,
  2. int limit = 10,
})
override

Implementation

@override
Future<List<Document>> find({required List<double> vector, int limit = 10}) async {
  if (vector.length != dimension) {
    throw ArgumentError('Query vector length (${vector.length}) must equal collection dimension ($dimension).');
  }
  final vectors = await repository.getVectors();
  final results = <String, double>{};

  for (var row in vectors) {
    final v = VectorUtils.bytesToVector(row.vector, dimension);
    final distance = (metric == Metric.cosine) ? _cosineSimilarity(vector, v) : _euclideanDistance(vector, v);
    results[row.id] = distance;
  }

  final sortedEntries = results.entries.toList()
    ..sort((a, b) => (metric == Metric.cosine)
        ? b.value.compareTo(a.value)
        : a.value.compareTo(b.value)
    );
  final ids = sortedEntries.take(limit).map((e) => e.key).toList();

  if (ids.isEmpty) {
    return [];
  }

  return await getDocuments(ids: ids);
}