<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alaa Al-Hamadani</title>
    <description>The latest articles on DEV Community by Alaa Al-Hamadani (@hamdanialaa3).</description>
    <link>https://dev.to/hamdanialaa3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3767430%2Fb72fc9dc-3f66-4a1f-8ca8-633ea22d8410.jpeg</url>
      <title>DEV Community: Alaa Al-Hamadani</title>
      <link>https://dev.to/hamdanialaa3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hamdanialaa3"/>
    <language>en</language>
    <item>
      <title>Building Hybrid Search</title>
      <dc:creator>Alaa Al-Hamadani</dc:creator>
      <pubDate>Thu, 12 Feb 2026 01:00:29 +0000</pubDate>
      <link>https://dev.to/hamdanialaa3/building-hybrid-search-5fbm</link>
      <guid>https://dev.to/hamdanialaa3/building-hybrid-search-5fbm</guid>
      <description>&lt;p&gt;🚀 Building Hybrid Search for Koli One Using Algolia + Firestore (2026 Architecture Deep-Dive)&lt;br&gt;
How we combined Firestore’s consistency with Algolia’s instant search to power Bulgaria’s next-generation automotive marketplace.&lt;/p&gt;

&lt;p&gt;📌 Introduction&lt;br&gt;
At Koli One, we faced a clear challenge: how to build a search system that was fast, intelligent, and flexible enough to handle the needs of the Bulgarian automotive market?&lt;/p&gt;

&lt;p&gt;Searching for cars isn't just about “text”—it requires:&lt;/p&gt;

&lt;p&gt;Precise matching (VIN, license plate number, ID)&lt;/p&gt;

&lt;p&gt;Fuzzy search (BMW → BMV → BWM)&lt;/p&gt;

&lt;p&gt;Multiple filters (price, year, fuel type, city)&lt;/p&gt;

&lt;p&gt;Geographic search (cars within 10 km of Sofia)&lt;/p&gt;

&lt;p&gt;Natural queries (blue BMW under 15,000 in Sofia)&lt;/p&gt;

&lt;p&gt;Neither Firestore nor Algolia alone was enough.&lt;/p&gt;

&lt;p&gt;The solution? Hybrid Search Architecture.&lt;/p&gt;

&lt;p&gt;🧩 Cover Image (Architecture Diagram)&lt;br&gt;
(Use the system image we created previously — the diagram showing Firestore + Algolia + Query Router)&lt;/p&gt;

&lt;p&gt;🔍 Why did we choose Hybrid Search?&lt;/p&gt;

&lt;p&gt;Firestore excels at:&lt;/p&gt;

&lt;p&gt;Strong consistency&lt;/p&gt;

&lt;p&gt;Precise queries&lt;/p&gt;

&lt;p&gt;Geoqueries&lt;/p&gt;

&lt;p&gt;Real-time updates&lt;/p&gt;

&lt;p&gt;But Firestore is weak in:&lt;/p&gt;

&lt;p&gt;Full-text search&lt;/p&gt;

&lt;p&gt;Fuzzy matching&lt;/p&gt;

&lt;p&gt;Fasted filters&lt;/p&gt;

&lt;p&gt;Ranking&lt;/p&gt;

&lt;p&gt;Algolia excels at:&lt;/p&gt;

&lt;p&gt;Instant search&lt;/p&gt;

&lt;p&gt;Type tolerance&lt;/p&gt;

&lt;p&gt;Fasting&lt;/p&gt;

&lt;p&gt;Ranking&lt;/p&gt;

&lt;p&gt;NLP-friendly search&lt;/p&gt;

&lt;p&gt;But Algolia is not a database.&lt;/p&gt;

&lt;p&gt;So we built a system that combines both.&lt;/p&gt;

&lt;p&gt;🏗️ Architecture Overview&lt;br&gt;
The Koli One search system works as follows:&lt;/p&gt;

&lt;p&gt;Writing Code&lt;br&gt;
User&lt;br&gt;
↓&lt;br&gt;
Query Parser (NLP)&lt;br&gt;
↓&lt;br&gt;
Query Router&lt;br&gt;
↓──────────────┐&lt;br&gt;
Firestore Algolia&lt;br&gt;
↓ ↓&lt;br&gt;
Merge + Dedupe&lt;br&gt;
↓&lt;br&gt;
UI&lt;br&gt;
Firestore = Source of Truth&lt;br&gt;
All cars, seller data, conditions, and geolocation are stored in the Firestore.&lt;/p&gt;

&lt;p&gt;Algolia = Search Accelerator&lt;br&gt;
We send an enhanced version of the car data to Algolia via Cloud Functions.&lt;/p&gt;

&lt;p&gt;Query Router&lt;br&gt;
Simple Query → Firestore&lt;/p&gt;

&lt;p&gt;Text Query → Algolia&lt;/p&gt;

&lt;p&gt;Geographic Query → Firestore&lt;/p&gt;

&lt;p&gt;Combined Query → Algolia + Firestore&lt;/p&gt;

&lt;p&gt;⚙️ Algolia Integration&lt;br&gt;
Index Schema&lt;br&gt;
json&lt;br&gt;
{&lt;br&gt;
"objectID": "car123",&lt;/p&gt;

&lt;p&gt;"title": "2018 BMW X5",&lt;/p&gt;

&lt;p&gt;"make": "BMW",&lt;/p&gt;

&lt;p&gt;"model": "X5",&lt;/p&gt;

&lt;p&gt;"year": 2018,&lt;/p&gt;

&lt;p&gt;"price": 45000,&lt;/p&gt;

&lt;p&gt;"city": "Sofia",&lt;/p&gt;

&lt;p&gt;"_geoloc": {"lat": 42.6977, "lng": 23.3219},&lt;/p&gt;

&lt;p&gt;"searchableAttributes": ["title", "make", "model"]&lt;br&gt;
}&lt;br&gt;
Faceting Configuration&lt;br&gt;
We have enabled the following filters:&lt;/p&gt;

&lt;p&gt;make&lt;/p&gt;

&lt;p&gt;model&lt;/p&gt;

&lt;p&gt;city&lt;/p&gt;

&lt;p&gt;fuelType&lt;/p&gt;

&lt;p&gt;condition&lt;/p&gt;

&lt;p&gt;vehicleType&lt;/p&gt;

&lt;p&gt;Replica Indices&lt;br&gt;
For sorting results:&lt;/p&gt;

&lt;p&gt;cars_bg (default relevance)&lt;/p&gt;

&lt;p&gt;cars_bg_price_asc&lt;/p&gt;

&lt;p&gt;cars_bg_price_desc&lt;/p&gt;

&lt;p&gt;cars_bg_createdAt_desc&lt;/p&gt;

&lt;p&gt;Cost Optimization&lt;br&gt;
Only upload cars to Algolia:&lt;/p&gt;

&lt;p&gt;Published cars only (status: active)&lt;/p&gt;

&lt;p&gt;Not drafts or deleted cars&lt;/p&gt;

&lt;p&gt;🔥 Firestore Query Layer&lt;br&gt;
Firestore is used for:&lt;/p&gt;

&lt;p&gt;Exact match queries&lt;/p&gt;

&lt;p&gt;Geo queries&lt;/p&gt;

&lt;p&gt;Seller inventory&lt;/p&gt;

&lt;p&gt;Numeric ID retrieval&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;js&lt;br&gt;
cars.where("make", "==", "BMW")&lt;/p&gt;

&lt;p&gt;.where("city", "==", "Sofia")&lt;br&gt;
🧠 Query Router Logic&lt;br&gt;
Decision Tree&lt;br&gt;
brand + city → Firestore&lt;/p&gt;

&lt;p&gt;“blue BMW in Sofia” → Algolia + NLP&lt;/p&gt;

&lt;p&gt;geo + radius → Firestore&lt;/p&gt;

&lt;p&gt;fuzzy text → Algolia&lt;/p&gt;

&lt;p&gt;Example Code&lt;br&gt;
js&lt;br&gt;
function routeQuery(query) {&lt;br&gt;
if (isExact(query)) return searchFirestoreExact(query);&lt;/p&gt;

&lt;p&gt;if (isGeoQuery(query)) return searchFirestoreGeo(query);&lt;/p&gt;

&lt;p&gt;if (isNaturalLanguage(query)) {&lt;br&gt;
const parsed = parseNLP(query);&lt;/p&gt;

&lt;p&gt;return searchAlgolia(parsed);&lt;/p&gt;

&lt;p&gt;}&lt;br&gt;
return searchAlgolia(query);&lt;/p&gt;

&lt;p&gt;}&lt;br&gt;
📈 Results&lt;br&gt;
Average search time: &amp;lt; 60ms&lt;/p&gt;

&lt;p&gt;Higher accuracy in results&lt;/p&gt;

&lt;p&gt;Natural query support&lt;/p&gt;

&lt;p&gt;A modern search experience similar to Google&lt;/p&gt;

&lt;p&gt;🔚 Conclusion&lt;br&gt;
Hybrid Search using Algolia + Firestore gave us:&lt;/p&gt;

&lt;p&gt;Speed&lt;/p&gt;

&lt;p&gt;Intelligence&lt;/p&gt;

&lt;p&gt;Flexibility&lt;/p&gt;

&lt;p&gt;Scalability&lt;/p&gt;

&lt;p&gt;Excellent user experience&lt;/p&gt;

&lt;p&gt;This system is the backbone of Koli One's auto-search.&lt;/p&gt;

&lt;p&gt;✨ Try Koli One for free&lt;br&gt;
&lt;a href="https://koli.one" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friy7bhiydl2q539z1hje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friy7bhiydl2q539z1hje.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔖 Tags&lt;/p&gt;
&lt;h1&gt;
  
  
  architecture #firebase #algolia #typescript #webdev
&lt;/h1&gt;
&lt;/blockquote&gt;

</description>
      <category>architecture</category>
      <category>firebase</category>
      <category>algoliachallenge</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
