Skip to main content
Three kinds of “search”:

Filter

Narrow a known set by exact-match criteria. “Show me tasks assigned to me with status open.” Use indexed Convex queries.

Full-text

Find by keyword in text fields. “Tasks containing ‘Q2 report’.” Use Convex full-text search.

Semantic / vector

Find by meaning, not exact words. “Tasks about end-of-quarter reporting.” Use Convex vector search.

Decision tree

1

Are you matching exact values? (status = open, assignee = me)

Filter. Indexed where clauses.
2

Are you matching keywords in text? (titles, body, descriptions)

Full-text search.
3

Do you want results that are conceptually related, not just keyword-matched?

Vector search (with embeddings).

Combining

Many UIs combine all three:
  • A search bar (full-text on title + body)
  • Filter pills (filter by status, assignee, priority)
  • An “Ask in natural language” mode (vector search for conceptual queries)

Filter UI patterns

Pill filters

Click pills to toggle filters. Active filters visible as chips above the list.

Sidebar filters

Persistent filter panel. Best for data-heavy UIs (admin, analytics).

Inline command

A cmdk-style command bar. Power-user feel; takes practice.

URL query params

Persist filter state in the URL so it survives refresh and is shareable.

Tips

Start with filter, add search later. Most “search” requests are really filter requests in disguise.
Debounce search inputs. 200ms is plenty. Avoids hammering the backend on every keystroke.

Full-text search

Convex implementation.

Vector search

Semantic implementation.

Algolia

Hosted search alternative.
Last modified on April 18, 2026