192 lines
6.8 KiB
Markdown
192 lines
6.8 KiB
Markdown
# 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_name` term 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 system
|
|
- `tags.contexts.tags.name_{locale}^2` - User-generated tags (highest boost)
|
|
- `tags.contexts.categories.name_{locale}^1.4` - Tag categories
|
|
- `motivation_{locale}^1` - Profile motivation
|
|
- `about_short_{locale}^1` - Short description
|
|
- `about_{locale}^1` - Full description
|
|
- `name^1` - Profile name
|
|
- `full_name^1` - Full profile name
|
|
- `locations.{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 content
|
|
- `post_translations.excerpt_{locale}^1.5` - Post excerpt
|
|
- `post_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)
|
|
1. **same_district**: 5.0x boost (1000 base score)
|
|
2. **same_city**: 3.0x boost (800 base score)
|
|
3. **same_division**: 2.0x boost (600 base score)
|
|
4. **same_country**: 1.5x boost (400 base score)
|
|
5. **different_country**: 1.0x boost (200 base score)
|
|
6. **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:
|
|
1. Profile name/full_name
|
|
2. about_short/about fields
|
|
3. Skills (cyclos_skills)
|
|
4. Tags and categories
|
|
5. 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_hidden`
|
|
- `profile_email_unverified.profile_search_hidden`
|
|
- `profile_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. |