qobrix_search_properties
Search property listings combining hard filters and weighted preferences to rank results by relevance. Returns top-N matches with scores for smarter property discovery.
Instructions
Highly relevant property search for free-language buyer demand (F1-optimized). TWO-TIER RECIPE: (1) search = hard DSL must-haves (server filter → precision). (2) boost[] = soft weighted nice-to-haves scored client-side over up to max_scan candidates (recall + ranking → better precision@top). (3) limit = how many ranked rows to return (default 10, max 100) — raise for more options, keep modest to avoid context overload. With boost: returns top-N with _relevance (score) and _matched (which boosts hit); pagination.mode='ranked' and pagination.scanned shows pool size. Without boost: fast path — single cached list page (pagination.mode='fast'). Call qobrix_search_dsl_help({resource:'Properties'}) before composing queries. Examples: Hard only: search='status == "available" and sale_rent == "for_sale" and city contains "Limassol"'. Demand match: search='status == "available" and sale_rent == "for_sale"', boost=[{field:'sea_view',op:'==',value:true,weight:3},{field:'bedrooms',op:'>=',value:3,weight:2},{field:'list_selling_price_amount',op:'in',value:'200000..600000',weight:2}], limit=15, max_scan=200. PAYLOAD: keep expand=false / media=false for search; when either is true, max_scan is auto-capped at 100. If a result returns status='result_too_large' with _refine_required, ask the user to narrow the query (filters, fields[], smaller limit, drop expand/media) then retry. All upstream pages are response-cached (QOBRIX_CACHE_TTL, default 300s).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1). Used on the fast path (no boost). Ignored when boost is set (ranking returns a single top-N page). | |
| sort | No | Sort by field name (maps to Qobrix OpenAPI sort[]). Prefix with - for descending. Comma-separated for multi-key (e.g. '-list_selling_price_amount,-created'). Examples: '-created' (newest first), 'name' (alphabetical), '-list_selling_price_amount' (highest list price first). | |
| boost | No | Soft relevance criteria (nice-to-haves). Never filters out rows — only ranks them. When present, the tool scans up to max_scan candidates matching `search`, scores each row as the sum of matched clause weights, and returns the top `limit` with _relevance and _matched. Put must-haves in `search`; put preferences here. Example: [{field:'sea_view',op:'==',value:true,weight:3},{field:'bedrooms',op:'>=',value:3,weight:2}]. | |
| limit | No | How many results to return (1-100, default 10). With boost: top-N after ranking. Without boost: page size. Raise when the user wants more options; keep low to avoid context overload. | |
| media | No | Include inline media on each row. Default false. Only set true when media URLs are needed. | |
| expand | No | Expand FK references into nested objects. Default false (FKs stay as UUID strings). | |
| fields | No | Limit response to specific fields only (partial response). Reduces payload size. Example: ['id','name','status','list_selling_price_amount']. Omit to get all fields. | |
| search | No | Hard-filter Qobrix search expression (server-side precision). Operators: == != <> < > <= >=, contains, starts with, ends with, in [...], not in, ranges in a..b, and/or/not. Functions: DISTANCE_FROM, IN_POLYGON, TRANSLATED, MIN/MAX, DAYS_AGO(n), MONTHS_AGO(n), DAYS_FROM_NOW(n). Shortcuts: NOW, TODAY, THIS_WEEK, LAST_MONTH, THIS_YEAR, CURRENT_USER. Strings double-quoted; booleans true/false; association paths e.g. SalespersonUsers.Contacts.country. Example: status == "available" and sale_rent == "for_sale" and list_selling_price_amount <= 500000. For the full grammar + field cheatsheets call qobrix_search_dsl_help. For enum values call qobrix_get_field_options; for all fields call qobrix_get_schema. | |
| max_scan | No | Candidate pool size when boost is set (default 100, hard cap 500). When expand=true or media=true the effective scan is capped at 100 (pagination.scan_capped_reason='expand/media') to keep latency and payload size safe. Higher improves recall (less chance of missing a good listing) but costs more API pages. Ignored on the fast path (no boost). Each scanned page is response-cached. |