Initial commit

This commit is contained in:
Ronald Huynen
2026-03-23 21:37:59 +01:00
commit 2547717edb
2193 changed files with 972171 additions and 0 deletions

View File

@@ -0,0 +1,192 @@
# 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.