Retrieval that understands intent and respects keywords
Kelu combines semantic vector search with full-text ranking and fuses the results — so "rotate credentials" finds the page titled "regenerate API keys," and an exact error code still matches exactly.
How retrieval works
The pipeline behind every answer, search box, and bot
Semantic Search
- OpenAI text-embedding-3-large embeddings
- pgvector cosine similarity over every chunk
- Matches paraphrases, synonyms, and vague phrasing
- Cross-language matching for multilingual users
- Heading-aware chunking preserves context
Full-Text Search
- PostgreSQL full-text ranking (ts_rank_cd)
- Exact matches for error codes and identifiers
- Product names and API terms rank correctly
- No embedding fuzziness on literal queries
- Runs in the same store as your vectors
Fusion & Scoping
- Reciprocal rank fusion merges both result sets
- Source-group filters scope retrieval by product or version
- Document visibility rules applied at query time
- Result limit per request
- Exposed via Search API, widget, bots, and MCP
The search behind everything
The same hybrid retrieval powers RAG answer grounding, the widget's search mode, the public Search API, MCP's search tool, and the Ask portal. Improve your content once and every surface gets better — there is no separate search product to tune.
- Grounding for every RAG answer and citation
- Standalone search results with relevance scores
- Scoped retrieval via source groups (product, version, region)
- Restricted documents kept off public surfaces
- Unanswered questions feed the knowledge-gap report
{
"query": "rotate credentials",
"limit": 5
}
// → chunks ranked by fused score
{
"results": [
{
"chunk": { "content": "To regenerate a key, open Settings..." },
"document": {
"title": "Regenerate API keys",
"url": "https://docs.example.com/api-keys"
},
"rrf_score": 0.031
}
]
}Answers you can check, from a system that won't guess
Every answer from your docs shows its sources
Numbered links point to the page and section each part of the answer came from, so anyone can check it in one click.
It says "I don't know"
When your content does not cover a question, Kelu does not guess. In a helpdesk it posts nothing and tags the ticket for your team.
It stays in sync on its own
Each source re-syncs on its own schedule, from every 5 minutes for tickets to daily for websites. Unchanged pages are skipped.
Got questions?
Frequently Asked Questions
Common questions about Hybrid Search
Vector search excels at meaning but blurs exact identifiers; keyword search nails identifiers but misses paraphrases. Fusing both with reciprocal rank fusion means "pump won't prime" and "ERR_4012" both retrieve the right page.
Pages are normalized from HTML to markdown, then chunked heading-aware so each chunk carries coherent context, then embedded with OpenAI's text-embedding-3-large. Both the vector and a full-text index are stored per chunk in PostgreSQL with pgvector.
Yes. Source groups let you scope retrieval by product line, version, or region, and client keys can enforce allowed groups — narrowing what an integration can retrieve, never widening it.
Yes. Documents marked restricted are only retrievable by workspace members and your Slack and Teams bots; public-facing surfaces retrieve only from public documents.
Yes. The public Search API returns ranked chunks with scores and URLs — teams use it for docs search bars, related-articles surfaces, and custom UIs, independent of the RAG chat.
Search that finds what users mean
Index a source and try hybrid search on your own content in minutes.
Free to start · No credit card required