Tag Indexes
This page is part of the documentation for Orleans.Lattice 9.9.0 (release line 9.9), built 2026-10-04. It is also published as markdown, with every table and list, at README.md, and llms.txt lists every page.What it shows
A tag index lets you attach arbitrary string tags to keys and then query the
keys back by tag. This sample tags four catalogue items and runs the two query
shapes: WithAllTags(...) (intersection / AND - a key must carry every tag) and
WithAnyTags(...) (union / OR - a key matches if it carries any tag).
The sample opens the index through the ILatticeTagIndexFactory that
AddLattice registers, and writes each item's value before tagging it:
tagging a key throws InvalidOperationException while its tree is still
unregistered, so write to the subject tree (or use SetValueWithTags) before
tagging its keys.
Run it
dotnet run --project samples/TagIndexes
Expected output
Silo starting... ready.
== Seeding catalogue items ==
wrote item:1
wrote item:2
wrote item:3
wrote item:4
== Associating tags with keys ==
item:1 += [red, round]
item:2 += [red, square]
item:3 += [blue, round]
item:4 += [green, square]
== WithAllTags("red", "round") - intersection ==
item:1
count = 1 (expected item:1 only)
== WithAnyTags("red", "blue") - union ==
item:1
item:2
item:3
count = 3 (expected item:1, item:2, item:3)
Done. WithAllTags narrows (AND); WithAnyTags widens (OR).
When to use
- Faceted lookups: find keys by category, label, or membership without scanning
the whole tree.
WithAllTagsfor "must match all facets",WithAnyTagsfor "match any facet". - Secondary access paths over a primary key/value tree (e.g. items by colour, documents by label).
When not to use
- Range or ordered queries. Tags are set membership, not sortable ranges - use a key-ordered scan for range access.