Many organizations believe that implementing vector databases and semantic embeddings will instantly resolve their internal retrieval issues. The promise is attractive: index your unstructured documents, let a model translate them into high-dimensional space, and allow users to search using natural language. No keywords or tagging required.
In practice, purely semantic search models frequently fail under real-world operational constraints. They struggle with exact matching (such as part numbers, serial codes, or alphanumeric identifiers), obscure industry-specific abbreviations (e.g., matching 'ECCS' in nuclear contexts or 'SCADA' in controls), and temporal queries (e.g., 'recent updates'). True search relevance does not start with embeddings; it starts with metadata taxonomy and clean data modeling.
The Limits of Pure Vector Similarity
Vector search excels at matching conceptual synonyms, but vector similarity alone does not enforce structured attributes; those constraints must be modeled separately and applied by the retrieval system. For example, if a user searches for 'quarterly report 2025 energy', a vector model might match documents discussing quarterly results in 2023 or agriculture-related energy policies because the semantic distance is close. It cannot perform a strict logical filter on the 'year' or 'industry' fields unless those attributes are explicitly extracted, modeled, and filtered.
Without a structured taxonomy to organize documents, search results collapse into a list of conceptually similar but operationally irrelevant files.
Hybrid Search: The Pragmatic Standard
To build a search system that actually works under real operating conditions, we must combine semantic capability with structured filters in a hybrid architecture.
- Keyword / BM25 Matching: Handles exact terminology, identifiers, names, and short codes.
- Semantic Dense Retrieval: Matches synonyms, intent, and cross-lingual concepts.
- Taxonomy Filters: Limits the search space to logical dimensions (e.g., document type, department, date range, client).
A Typical Hybrid Search Pipeline
At General Applications, we design search pipelines that enforce metadata constraints at retrieval time (pre-filtering) rather than filtering results afterward. Post-filtering vector lookups often discard the top K semantic matches, resulting in empty pages; pre-filtering preserves the eligible result pool before ranking, reducing empty or undersized pages and making pagination behavior more predictable.
type SearchQuery = {
text: string;
filters: {
industry?: string;
docType?: string;
dateMin?: string;
};
};
async function executeHybridSearch(query: SearchQuery) {
// 1. Build strict filters using the taxonomy
const filterClause = buildTaxonomyFilter(query.filters);
// 2. Query vector database with pre-filtering
const semanticResults = await vectorStore.query({
vector: await generateEmbedding(query.text),
filter: filterClause,
limit: 50
});
// 3. Query keyword index with the same constraints
const keywordResults = await fullTextIndex.query({
query: query.text,
filter: filterClause,
limit: 50
});
// 4. Reciprocal Rank Fusion (RRF) to merge and score
return mergeAndScore(semanticResults, keywordResults);
}The Role of Canonical Modeling
Before search indexation, data must be normalized. If three systems store client names as 'GA LLC', 'General Apps', and 'General Applications', the system cannot perform strict filtering. Establishing a canonical data model and writing automated pipelines to reconcile references is essential. Search relevance is rarely just a search index tuning challenge; it is fundamentally an information architecture and source-data cleanliness challenge.