Semantic search
Search that matches on meaning instead of exact words, so 'how do I cancel' finds the page titled 'ending your subscription'.
See it
What it is
Keyword search matches characters. Semantic search matches meaning: every document is converted to an embedding, a long list of numbers positioning it in a space where related ideas sit close together. Your query gets the same treatment, and the engine returns whatever is nearest, usually by cosine similarity. That is why 'how do I cancel' surfaces a page titled 'ending your subscription' with zero shared words.
Reach for it when users describe rather than name things: help centers, support tickets, note apps, product catalogs, and the retrieval step of any RAG pipeline. Quality is decided upstream of the fancy part. Chunk size, what metadata you attach, and which embedding model you picked matter more than the vector database you chose.
The honest weakness: semantic search is bad at exactly the queries keyword search nails. Product SKUs, error codes, surnames, and version numbers have no interesting meaning to embed, so 'ERR_2043' happily returns five thematically similar errors and not that one. It also always returns something, ranked confidently, even when nothing relevant exists. Production systems almost always run hybrid search (keyword plus vector) with a reranker on top, and cut results below a similarity floor.
Ask AI for it
Build semantic search over this content. Chunk the documents into roughly 300 to 500 token passages with slight overlap, keep title and source metadata on each chunk, embed them with a current embedding model, and store the vectors in pgvector (or the project's existing vector store). At query time, embed the user's query, retrieve the top 20 by cosine similarity, drop anything under a similarity threshold, and return the top 5 with source links and the matching snippet. Combine it with keyword search over the same corpus so exact identifiers like error codes and SKUs still work, and make re-embedding a single idempotent command to run when content changes.