Implementing Semantic Search
1. Encoding Text Queries
Example: Query Embedding
q = "how does vector search work?"
qv = client.embeddings.create(
model="text-embedding-3-small", input=q
).data[0].embedding
| Tip | Detail |
|---|---|
| Same model as docs | Mismatched models = poor results |
| Query prefixes | e.g., e5 wants query: prefix |
2. Performing Vector Search
Example: Semantic Query
res = index.query(vector=qv, top_k=10, include_metadata=True)
hits = [(m["metadata"]["title"], m["score"]) for m in res["matches"]]
3. Ranking Results by Similarity
| Stage | Detail |
|---|---|
| Initial rank | By Pinecone score |
| Re-rank | Cross-encoder for top-50 → top-10 |
| Business boost | Recency, popularity factors |
4. Implementing Faceted Search
Example: Facets via Filter
res = index.query(
vector=qv, top_k=10, include_metadata=True,
filter={"$and": [
{"category": "tech"},
{"language": "en"},
{"published_year": {"$gte": 2024}},
]},
)
5. Using Boosting Strategies
| Boost Type | Implementation |
|---|---|
| Recency | score + decay(age) |
| Popularity | score + log(views) |
| Authority | Filter / multiply by source weight |
| Personalization | Add user-pref vector to query |
6. Implementing Personalization
Example: Bias Query Vector
import numpy as np
def personalize(query_vec, user_vec, weight=0.2):
qv = np.array(query_vec); uv = np.array(user_vec)
blended = (1 - weight) * qv + weight * uv
blended /= np.linalg.norm(blended)
return blended.tolist()
7. Handling Multi-Language Search
| Strategy | Detail |
|---|---|
| Multilingual model | multilingual-e5, Cohere embed-v3 |
| Per-language namespace | Isolated indexes per locale |
| Translate at query time | Normalize to English embeddings |
8. Implementing Auto-Complete
Example: Prefix + Embedding
# Combine prefix filter + semantic suggestion
prefix = user_input
qv = embed(prefix)
res = index.query(vector=qv, top_k=5,
filter={"title_lc": {"$in": matching_prefixes(prefix)}})
9. Optimizing Search Relevance
| Lever | Effect |
|---|---|
| Hybrid search | Better keyword match |
| Reranker | +5–15% relevance |
| Chunk size tuning | 200–500 tokens typical |
| Query expansion | LLM rewrites query |
10. A/B Testing Search Strategies
A/B Test Loop
- Split traffic 50/50 between strategy A and B.
- Log query, returned IDs, user clicks/conversions.
- Compute CTR@K, MRR, nDCG per variant.
- Decide winner with statistical significance.
| Metric | Meaning |
|---|---|
| CTR@K | Clicks in top-K / impressions |
| MRR | Mean reciprocal rank of first click |
| nDCG | Graded relevance score |