Aito combines text similarity with user context to rank search results by relevance to the specific user. The same query returns different results for different users, automatically personalized based on their behavior patterns.
Same "milk" search, personalized for Larry: lactose-free products ranked first based on his behavior
These queries search the same product catalog but return different results depending on the user. Larry gets lactose-free options, Alice gets organic products.
Personalized search and autocomplete from our demo e-commerce database
Search 'milk' as Larry — results ranked by his lactose-free preferences
{
"from": "impressions",
"where": {
"context.user": "larry",
"context.query": "milk"
},
"recommend": "product",
"goal": {
"purchase": true
},
"limit": 5,
"select": [
"$p",
"name",
"tags"
]
}Keep your product catalog alongside user interaction data:
{
"context": { "user": "larry", "query": "milk" },
"product": { "name": "Oat Milk", "tags": ["dairy-free", "plant-based"] },
"purchase": true
}
Search with both text matching and user context — Aito combines them automatically:
{
"from": "impressions",
"where": {
"context.user": "larry",
"context.query": "milk"
},
"recommend": "product",
"goal": { "purchase": true },
"limit": 5
}
Results ranked by purchase probability for that specific user, filtered by text relevance.
Key capabilities:
$match operator$startsWith for real-time search suggestionsThe ranking above is built on text matching and user context. For meaning-based retrieval, v2 keeps vectors in the same store as your facts and text, so semantic search is not a separate system to run and keep in sync.
v2 has a Vector column type. It retrieves nearest neighbours with $nearest, scores rows with $similarity, and fuses nearest-neighbour evidence straight into a prediction with $semantic, so the meaning of the text becomes evidence in the answer rather than a separate search you reconcile afterwards.
POST /api/v2/_query
{
"from": "products",
"where": { "$nearest": { "near": { "embedding": [0.12, -0.03, 0.88] },
"having": { "$similarity": { "$gte": 0.8 } }, "limit": 10 } },
"select": ["name", "$similarity"]
}
Because the vectors, the text, and the facts live together, one query does what usually takes a vector store plus a JSON blob, or an Elasticsearch index kept in sync alongside your database. A query written in one language also finds evidence recorded in another: trained on English intent data (Amazon MASSIVE) and tested in German and Spanish, semantic nearest-neighbour scores 0.59 and 0.75 against 0.13 and 0.15 for the token baseline. Because the search is exact, retrieval quality is that of your embedding model: on BEIR SciFact with all-MiniLM-L6-v2, $nearest scores nDCG@10 of about 0.65, the published figure for that encoder. The numbers and the hybrid lexical, semantic and predictive ranking are in the vector search docs.
One honest limit: vector search is exact, a full scan of the candidates with no approximate index, and by default you bring your own vectors. A Vector column can instead declare an embedder endpoint you run, and Aito then embeds text at ingest and at query time.
Start for free → Upload your product and interaction data to build personalized search.
Try the full e-commerce demo → See personalized search in action in a complete grocery store app.
Episto Oy
Putouskuja 6 a 2
01600 Vantaa
Finland
VAT ID FI34337429