A few days back I shared my experiments with hybrid search (combining traditional lexical search with vector/semantic search). Well, I’ve been busy, and I’m back with some that I think you’ll find interesting. We now have 1024-dimensional embeddings, blazing fast GPU inference, and you can generate embeddings via our free API endpoint. Plus: you can literally search with emojis now. Yes, really. 🚲 finds bicycles. 🐕 finds dog jewelry. Keep reading. 1. Upgraded from 384D to 1024D Embeddings We switched from paraphrase-multilingual-MiniLM-L12-v2 (384 dimensions) to (1024 dimensions).Think of dimensions like pixels in an image. A 384-pixel image is blurry. A 1024-pixel image is crisp. More dimensions = the model can capture more nuance and meaning from your text.The practical result? Searches …
A few days back I shared my experiments with hybrid search (combining traditional lexical search with vector/semantic search). Well, I’ve been busy, and I’m back with some that I think you’ll find interesting. We now have 1024-dimensional embeddings, blazing fast GPU inference, and you can generate embeddings via our free API endpoint. Plus: you can literally search with emojis now. Yes, really. 🚲 finds bicycles. 🐕 finds dog jewelry. Keep reading. 1. Upgraded from 384D to 1024D Embeddings We switched from paraphrase-multilingual-MiniLM-L12-v2 (384 dimensions) to (1024 dimensions).Think of dimensions like pixels in an image. A 384-pixel image is blurry. A 1024-pixel image is crisp. More dimensions = the model can capture more nuance and meaning from your text.The practical result? Searches that “kind of worked” before now work , especially for:Non-English languages (Romanian, German, French, etc.)Domain-specific terminologyConceptual/semantic queries 2. Moved Embeddings to GPU Before: CPU embeddings taking 50-100ms per query. Now: GPU embeddings taking ~2-5ms per query.The embedding is so fast now that even with a network round-trip from Europe to USA and back, it’s than local CPU embedding was. Let that sink in. 3. Optimized the Hybrid Formula After a lot of trial and error, we settled on this normalization approach:score = vector_score + (lexical_score / (lexical_score + k)) Where is a tuning parameter (we use k=10). This gives you:Lexical score normalized to 0-1 rangeVector and lexical scores that play nice togetherNo division by zero issuesIntuitive tuning (k = the score at which you get 0.5) 4. Quality Filter with frange Here’s a pro tip: use Solr’s to filter out garbage vector matches:fq={!frange l=0.3}query($vectorQuery) This says “only show me documents where the vector similarity is at least 0.3”. Anything below that is typically noise anyway. This keeps your results clean and your users happy.I’ve set up several demo indexes. Each one has a Debug button in the bottom-right corner - click it to see the exact Solr query parameters and full analysis. Great for learning! 🛠️ Romanian Hardware Store (Dedeman) Search a Romanian e-commerce site with emojis:No keywords. Just an emoji. And it finds bicycle mirrors, phone holders for bikes, etc. The vector model understands that 🚲 = bicicletă = bicycle-related products. 💎 English Jewelry Store (Rueb.co.uk) Sterling silver, gold, gemstones - searched semantically: 🧣 Luxury Cashmere Accessories (Peilishop) Real-time crawled news, searchable semantically:This last one is pure semantic search - there’s no keyword “boost” or “health” necessarily in the results, but the matches. Free API Endpoint for 1024D Embeddings Want to try this in your own Solr setup? We’re exposing our embedding endpoint for free:curl POST https://opensolr.com/api/embed Returns a 1024-dimensional vector ready to index in Solr.: For smaller embedding models, repeat the title 3x in your embedding text. This focuses the model’s limited capacity on the most important content. Game changer for product search.topK isn’t “how many results”: It’s “how many documents the vector search considers”. The rest get score=0 for the vector component. Keep it reasonable (100-500) to avoid noise.Lexical search is still king for keywords: Hybrid means vector helps when lexical fails (emojis, conceptual queries), and lexical helps when you need exact matches. Best of both worlds.Use synonyms for domain-specific gaps: Even the best embedding model doesn’t know that “autofiletantă” (Romanian) = “drill”. A simple synonym file fixes what AI can’t.: Better to return 10 excellent results than 100 mediocre ones. Use and reasonable values.Fine-tuning embedding models for specific domainsRRF (Reciprocal Rank Fusion) as an alternative to score-based hybridMore aggressive caching strategiesHappy to answer questions. And seriously, click that Debug button on the demos - seeing the actual Solr queries is super educational!Running Apache Solr 9.x on OpenSolr.com - free hosted Solr with vector search support.