{% extends "base.html" %} {% import "_icons.html" as icons %} {% block title %}RAG search{% endblock %} {% block heading %}RAG search{% endblock %} {% block subhead %}

Hybrid BM25 + vector search over your vault — the same engine as eidetic search.

{% endblock %} {% block content %} {% if result is none %}
{{ icons.icon("zap", 14) }} hybrid BM25 keyword + vector similarity, reranked
{{ icons.icon("vectors", 14) }} vector pure semantic similarity (needs embeddings endpoint)
{{ icons.icon("hash", 14) }} keyword offline BM25 — works without an endpoint
{% elif not result.ok %}
{{ icons.icon("x-circle", 16) }} {{ result.error }}

Hybrid and vector search need the embeddings endpoint running. Try mode: keyword for offline BM25 search.

{% elif result.results %} {% set max_score = (result.results | map(attribute='score') | max) or 1 %}

{{ icons.icon("check-circle", 14) }} {{ result.results | length }} result{{ '' if result.results | length == 1 else 's' }} for “{{ result.query }}” {{ result.mode }}

    {% for r in result.results %} {% set rel = ((r.score / max_score * 100) | round | int) if max_score else 0 %}
  1. {{ loop.index }}
    {{ icons.icon("file", 14) }} {{ r.file }}{% if r.heading %} › {{ r.heading }}{% endif %} {{ '%.3f' % r.score }}

    {{ r.snippet }}

  2. {% endfor %}
{% else %}
{{ icons.icon("search", 32) }}

No results for “{{ result.query }}”.

{% endif %} {% endblock %}