For MLS Portals, Directories & Property Platforms
Enterprise search for large listing catalogs. Geolocation filtering, complex facets, real-time indexing. Faster search usually means more inquiries. Scale without breaking your database.
Real estate portals live or die by search. Slow search = lost listings = lost revenue. Database-driven search breaks at scale.
Database-driven search on large property datasets kills performance. Adding price filters, location filters, or custom attributes requires backend changes that take weeks.
Slow results, broken filters, and poor ranking push users to leave your portal. Competitors with better search capture more listings and higher commissions.
Scaling to millions of listings breaks your database. Search performance degrades, database costs skyrocket, and your competitive edge disappears.
Enterprise search built for listings. Scale to large catalogs without database strain.
Search by radius, city, neighborhood, or coordinates. Instant results for "homes within 5 miles of downtown" queries without database load.
Price ranges, property type, bedrooms, lot size, year built, HOA status, pet policies — unlimited custom facets. Users narrow results without database strain.
Search "modern condo in trendy neighborhood" and find exactly that. Understand intent beyond keywords — location vibe, property style, lifestyle fit.
New listings appear in search within seconds of posting. Updates, price changes, and status changes sync instantly from your MLS or listing system.
Rank listings by relevance, price, listing age, or custom scoring. Show users the listings they actually want, boost conversions, reduce support tickets.
Search runs externally. Your database stays responsive however much search traffic you get, so you avoid scaling it just for search.
Zillow, Realtor.com, Trulia-like platforms
Office, retail, industrial listing platforms
Yellow pages, B2B marketplaces, service directories
Airbnb-like vacation rental and long-term rental sites
Pull listings from your MLS feed (RETS/RESO) in a scheduled server-side script and push them to the bulk indexing endpoint
// Your own sync script (e.g. a nightly cron job), server-side only
const listings = await fetchListingsFromMls(); // your MLS/RETS client
const response = await fetch(
'https://app.searchjetengine.com/api/v1/index/bulk',
{
method: 'POST',
headers: {
// Private key: keep it in an env var, never in browser code
'Authorization': 'Bearer ' + process.env.SEARCHJET_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
documents: listings.map(listing => ({
id: String(listing.ListingKey),
title: listing.StreetAddress,
content: listing.PublicRemarks,
url: 'https://example.com/listings/' + listing.ListingKey,
type: 'listing',
// Custom fields are stored with the document
price: listing.ListPrice,
beds: listing.BedroomsTotal,
baths: listing.BathroomsTotalInteger,
sqft: listing.LivingArea,
propertyType: listing.PropertyType,
status: listing.Status
}))
})
}
);
const { taskUid } = await response.json();Bulk upload listings to POST /index/bulk. Upsert mode updates listings that already exist and creates new ones
// Batch index listings (server-side)
const response = await fetch(
'https://app.searchjetengine.com/api/v1/index/bulk',
{
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.SEARCHJET_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
documents: listings, // [{ id, title, content, url, ... }]; an existing id is replaced
})
}
);
const { taskUid } = await response.json();Point your listing system's webhooks at your own endpoint, which forwards each change to SearchJet
// Your own webhook endpoint (Express)
app.post('/webhooks/listings', async (req, res) => {
const { event, listing } = req.body;
if (event === 'listing.created' || event === 'listing.updated') {
await fetch('https://app.searchjetengine.com/api/v1/index/bulk', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.SEARCHJET_PRIVATE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
documents: [{
id: String(listing.id),
title: listing.address,
content: listing.description,
url: listing.url,
price: listing.price,
status: listing.status
// ... other fields
}]
})
});
}
res.sendStatus(200);
});Illustrative example of a listings portal moving off database search. Your results will vary.
| Metric | Before | After | Impact |
|---|---|---|---|
| Search Response Time | Seconds | <150ms | Fewer bounces |
| Database Queries/Search | Several per search | None | Search load off your database |
| Listing Conversion Rate | Baseline | More listings found | More inquiries likely |
| Support Tickets | "I can't find..." tickets | Fewer | Fewer search-related tickets |
Complex query combining location, price, and property attributes:
// Real estate search with filters. Safe to run in the browser
// with a SEARCH key (never the private key).
// price, beds, baths, propertyType and status must be marked filterable
// in your index settings, otherwise the API returns INVALID_FILTER.
const params = new URLSearchParams({
q: 'modern home near downtown',
filters: 'price >= 200000 AND price <= 800000 AND beds >= 3 AND baths >= 2 ' +
'AND propertyType IN ["Single Family", "Condo"] AND status = "Active"',
sort: 'date:desc', // Newest first
limit: '20'
});
const res = await fetch(
'https://app.searchjetengine.com/api/v1/search?' + params,
{ headers: { 'Authorization': 'Bearer YOUR_SEARCH_KEY' } }
);
const data = await res.json();
// Returns:
// - data.results: array of matching listings (id, title, url, price, ...)
// - data.facet_distribution: facet counts (50 Single Family homes, 30 Condos, etc.)
// - data.total: total matches
// - data.processing_time_ms: server-side search timeEnterprise support for real estate platforms
See how enterprise search can lift inquiries and reduce database costs at scale.
Enterprise support included. Talk to sales for custom pricing.