6.8 KiB
MainSearchBar Search Logic Reference
Overview
The MainSearchBar component (app/Http/Livewire/MainSearchBar.php) implements a sophisticated Elasticsearch-powered search system that searches across Users, Organizations, Banks, and Posts with advanced scoring, location-based prioritization, and intelligent result processing.
Search Flow Workflow
1. Input Processing (updatedSearch())
- Validation: Minimum 2 characters required
- Sanitization: Removes special characters, preserves alphanumeric and spaces
- Raw Term Storage: Stores original search term for suggestion mapping
2. Query Construction
The search builds a complex BoolQuery with model-specific sub-queries:
Profile Models (User, Organization, Bank)
Each profile type gets its own BoolQuery with:
- Model filtering:
__class_nameterm query - Field matching: Multi-match across searchable fields
- Model-specific boost: Applied at query level
- Location boosts: Geographic proximity scoring
Posts Model
- Publication filters: Date-based visibility (from/till/deleted_at)
- Category filtering: Configurable category inclusion
- Translation-aware: Locale-specific field matching
3. Field Configuration
Profile Search Fields (getProfileSearchFields())
Fields searched with their boost factors from config/timebank-cc.php:
cyclos_skills^1.5- Skills from external systemtags.contexts.tags.name_{locale}^2- User-generated tags (highest boost)tags.contexts.categories.name_{locale}^1.4- Tag categoriesmotivation_{locale}^1- Profile motivationabout_short_{locale}^1- Short descriptionabout_{locale}^1- Full descriptionname^1- Profile namefull_name^1- Full profile namelocations.{district|city|division|country}^1- Location fields
Post Search Fields (getPostSearchFields())
post_translations.title_{locale}^2- Post title (highest boost)post_translations.content_{locale}^1- Post contentpost_translations.excerpt_{locale}^1.5- Post excerptpost_category.names.name_{locale}^2- Category name
Result Prioritization System
1. Model-Level Boosts (config.timebank-cc.boosted_models)
- Posts: 4x boost (highest priority)
- Organizations: 3x boost
- Banks: 3x boost
- Users: 1x boost (baseline)
2. Location Proximity Scoring (calculateLocationProximity())
Uses the active user's location hierarchy to score results:
Proximity Levels (best to worst)
- same_district: 5.0x boost (1000 base score)
- same_city: 3.0x boost (800 base score)
- same_division: 2.0x boost (600 base score)
- same_country: 1.5x boost (400 base score)
- different_country: 1.0x boost (200 base score)
- no_location: 0.9x boost (0 base score)
Location Boost Application (addLocationBoosts())
For profile queries, adds additional SHOULD clauses for location matching:
- District match: 5.0 boost
- City match: 3.0 boost
- Division match: 2.0 boost
- Country match: 1.5 boost
3. Composite Scoring (processAndScoreResults())
Final score calculation:
composite_score = location_base_score + (elasticsearch_score * 20)
final_score = composite_score / 10
4. Search Optimization Helper
Optional enhancement (config.search_optimization.enabled):
- Profile verification boosts
- Complete profile bonuses
- Recent activity factors
- Category matching multipliers
Highlighting and Suggestions
1. Highlight Configuration
- Fragment size: 80 characters
- Fragments per field: 1-2 fragments
- Order: By relevance score
- Tags: Configurable HTML wrapping
- Field limiting: Only content fields highlighted (location excluded)
2. Highlight Priority (limitHighlights())
Returns single most relevant highlight in priority order:
- Profile name/full_name
- about_short/about fields
- Skills (cyclos_skills)
- Tags and categories
- Post titles/excerpts/content
3. Suggestion Generation (extractSuggestions())
From highlights, extracts up to 5 suggestions:
- Sentence-based extraction
- Search term context preservation
- 5-word maximum length
- Duplicate removal
Display Processing (Search/Show Component)
1. Result Caching (showSearchResults())
Results cached for 5 minutes (configurable) with:
- Search term
- Result references (model/id/highlight/score)
- Total count
- Cache key:
main_search_bar_results_{user_id}
2. Data Loading (Search/Show.render())
- Eager loading: Efficiently loads models by type
- Relationship optimization: Loads required relations only
- Pagination: 15 results per page (configurable)
3. Card Processing
Profile Cards
- Reaction data: Star/bookmark/like counts via Laravel-Love
- Location display: Short and full location strings
- Skills rendering: Responsive skill tag display with overflow indicators
- Status indicators: Online/away presence
- Profile filtering: Inactive/incomplete/unverified profiles hidden
Post Cards
- Media handling: Hero image display
- Meeting info: Date/venue/location extraction
- Category display: Translated category names
- Publication status: Date-based visibility enforcement
4. Search Score Display
- Normalized scores displayed to users
- Score transparency for result ranking understanding
Configuration Impact
Key Config Sections (config/timebank-cc.php)
main_search_bar.boosted_fields
Controls field-level importance in matching
main_search_bar.boosted_models
Sets model-type priority multipliers
main_search_bar.search
Elasticsearch query behavior and highlighting
search_optimization
Advanced scoring factors and location boosts
Profile Filtering Settings
profile_inactive.profile_search_hiddenprofile_email_unverified.profile_search_hiddenprofile_incomplete.profile_search_hidden
Performance Considerations
1. Elasticsearch Optimizations
- Index selection: Only searches relevant indices
- Query size limits: Max 50 results (configurable)
- Highlight optimization: Limited fragments and field selection
2. Laravel Optimizations
- Eager loading: Batch loads models with relationships
- Result caching: 5-minute TTL with extension on access
- Location caching: Hierarchy lookups cached when enabled
3. Frontend Optimizations
- Pagination: 15 items per page default
- Lazy loading: Skills and media loaded as needed
- Cache warming: Search extends cache TTL on result access
Search Analytics (Optional)
When search_optimization.analytics.enabled:
- Search pattern tracking
- Location-based search metrics
- Performance monitoring
- Result relevance analytics
This comprehensive search system balances relevance, performance, and user experience while providing rich, context-aware results with geographic and content-based prioritization.