-
Notifications
You must be signed in to change notification settings - Fork 0
Embeddings embeddingindex search
Development build. This page describes
main, not a released package. The latest published Lodestar.Embeddings is 0.4.0 — read its documentation.
The k most similar vectors to a query, best first.
public IReadOnlyList<SearchResult> Search(ReadOnlySpan<float> query, int k)Parameters — query is the query embedding and must have length Dimension. k is how many
hits to return and must be at least 1.
Returns — IReadOnlyList<SearchResult>, sorted by score descending. It holds
min(k, Count) entries: asking for more than the index contains is not an error, it simply
returns everything.
Exceptions — ArgumentException when query.Length differs from Dimension.
ArgumentOutOfRangeException when k is less than 1.
Example — the query is scaled and the score is still a cosine, and k past the end is
harmless.
using Lodestar.Embeddings.Search;
var index = new EmbeddingIndex(dimension: 2);
index.Add(new float[] { 1f, 0f });
index.Add(new float[] { 0f, 1f });
IReadOnlyList<SearchResult> hits = index.Search(new float[] { 5f, 0f }, k: 10);
int returned = hits.Count; // => 2
float top = hits[0].Score; // => 1
float second = hits[1].Score; // => 0Remarks — the query is normalized on a normalizing index, so its length never affects the
ranking. (5, 0) and (1, 0) are the same query.
Ties break on position, ascending. Two vectors with an identical score come back in insertion order, which makes the result reproducible across runs rather than dependent on the sort. That matters more than it sounds: duplicate documents in a corpus produce exact ties routinely.
Every stored vector is scored on every call — that is what exhaustive means, and it is why the
result is exact with no recall parameter to tune. The cost is linear in Count × Dimension, with
a small constant from VectorMath.Dot.
Concurrent calls are safe on an index nobody is adding to. Adding while searching is not.
The hits carry positions, not documents — GetId is the step from one
to the other, and SearchResult explains why it is a separate step.
Applies to — net10.0, netstandard2.0.
See also — EmbeddingIndex.Add, SearchResult,
EmbeddingIndex.
- 0001-target-framework
- 0002-unicode-comparison-unit
- 0003-provenance-and-licensing
- 0004-levenshtein-myers-backlog
- 0005-hamming-jellyfish-divergence
- 0006-ratcliff-autojunk
- 0007-metaphone-scope
- 0008-italian-enza-nltk-divergence
- 0009-sample-consumes-a-local-feed
- 0010-stop-word-list-provenance
- 0011-persistence-format
- 0012-per-package-versioning
- 0013-sentencepiece-parity-scope
- 0014-precompiled-normalizer
- 0015-sonar-rules-in-the-build
- 0016-metrics-package-placement
- 0017-bpe-parity-scope
- 0018-multiclass-roc-auc-parallelism-is-opt-in
- 0019-the-net-analysers-run-in-the-build-too
- 0020-normalize-is-a-projection-not-a-parameter
- 0021-multioutput-is-a-method-not-an-enum
- 0022-added-token-matching-flags
- 0023-byte-level-decode-substitutes
- 0024-weighted-median-averages-within-scikit-learns-epsilon
- 0025-quickselect-replaces-a-full-sort-for-the-median
- 0026-r2-and-explainedvariance-split-their-undefined-cases-differently
- 0027-r2-and-explainedvariance-vectorize-only-a-single-output
- 0028-log1p-is-kahans-identity-not-math-log-1-plus-x
- 0029-balanced-accuracy-adjusted-is-left-to-ieee-754-at-the-edge
- 0030-cohen-kappa-keeps-scikit-learns-expected-matrix-orientation
- 0031-nosamplecorrect-mirrors-numpys-float64-upcast
- 0032-fbeta-substitutes-tp-predicted-and-support-algebraically
- 0033-compensated-sum-is-neumaiers-variant
- 0034-dropout-is-refused-for-want-of-a-user
- 0035-a-null-pre-split-is-removed-with-invert-not-isolated
- 0036-a-member-may-ship-without-an-oracle-if-it-says-so
- 0037-the-guards-run-before-the-commit
- 0038-the-gate-confronts-an-exception-tag-with-the-page-that-documents-it
- 0039-mutual-information-returns-zero-on-an-empty-input
- 0040-a-curve-is-a-sealed-class-per-curve
- 0041-one-sample-file-per-public-class
- 0042-phonetic-encoders-refuse-a-null-word
- 0043-the-equality-table-is-sized-to-the-pattern
- 0044-compression-belongs-to-the-caller
- 0045-a-console-call-carries-its-reason-on-the-line
- 0046-check-adr-immutable-runs-in-ci-only
- 0047-one-gate-per-kernel-not-one-per-alphabet
- 0048-the-gate-depends-on-the-kernel-and-the-alphabet
- 0049-two-gates-per-kernel-tested-where-the-width-is-known
- 0050-the-sentencepiece-bpe-lineage-stays-a-bpe-model
- benchmark_latest
- decisions
- equivalence
- matplotlib
- migration
- nightly_run
- numpy
- pandas
- performance
- pytorch
- seaborn
- sklearn
- statsmodels