andres-montanez/recommendations-bundle
Installation
composer require andres-montanez/recommendations-bundle
Add to AppKernel.php:
new AndresMontanez\RecommendationsBundle\RecommendationsBundle(),
Configure MongoDB
Ensure your config.yml includes MongoDB connection details:
andres_montanez_recommendations:
mongo_db: your_database_name
mongo_host: localhost
mongo_port: 27017
First Use Case: Register Items
$recommendationService = $this->get('andres_montanez_recommendations.recommendation');
$recommendationService->registerItem('movie', 'batman', ['action', 'drama'], 'default_namespace');
Register User Actions
$recommendationService->addAction('user_123', 'rated', 'movie', 'batman', 5, 'default_namespace');
Trigger Similarity Update (via Cron)
php app/console andres-montanez:recommendations:update-similarities
Item Registration
registerItem() for products, movies, or any entity.foreach ($products as $product) {
$recommendationService->registerItem('product', $product->id, $product->tags, 'ecommerce_namespace');
}
User Interaction Tracking
viewed, purchased, or rated:
$recommendationService->addAction($userId, 'purchased', 'product', $productId, 1, 'ecommerce_namespace');
ProductViewedEvent) to auto-log interactions.Fetching Recommendations
$recommendations = $recommendationService->getRecommendations('user_123', 'default_namespace');
$recommendations = $recommendationService->getRecommendations(
'user_123',
'default_namespace',
['type' => 'movie', 'tags' => ['action']]
);
Cron Job Integration
update-similarities command weekly:
0 3 * * 1 php /path/to/console andres-montanez:recommendations:update-similarities
Namespace Isolation
site_a, site_b):
$recommendationService->registerItem('product', $id, [], 'site_a');
Custom Value Scaling
0-5 ratings → 0-1) for Pearson distance:
$normalizedValue = $rawValue / 5.0;
$recommendationService->addAction($userId, 'rated', 'movie', $id, $normalizedValue, 'namespace');
Caching Layer
$cache = $this->get('cache.app');
$key = "recs_{$userId}_{$namespace}";
if (!$cache->has($key)) {
$recommendations = $recommendationService->getRecommendations($userId, $namespace);
$cache->set($key, $recommendations, 86400); // 24h
}
Cold Start Performance
update-similarities run is slow (O(n²) complexity).Namespace Confusion
addAction()/registerItem().Data Skew
MongoDB Indexing
user, item, and namespace fields.Log Similarities
$similarities = $this->get('andres_montanez_recommendations.similarities');
file_put_contents('similarities.log', print_r($similarities->getAll(), true));
Test with Small Datasets
Monitor Cron Jobs
php app/console andres-montanez:recommendations:update-similarities --env=prod > /var/log/recs_update.log 2>&1
Custom Similarity Metrics
PearsonDistance by extending the service:
class CustomSimilarity extends \AndresMontanez\RecommendationsBundle\Similarity\PearsonDistance {
protected function calculate($a, $b) { ... }
}
services:
custom_similarity:
class: Your\Bundle\CustomSimilarity
tags:
- { name: andres_montanez_recommendations.similarity }
Post-Processing Recommendations
$rawRecs = $recommendationService->getRecommendations($userId, $namespace);
$filteredRecs = array_filter($rawRecs, function($item) {
return $item['score'] > 0.5; // Custom threshold
});
Hybrid Recommendations
$recommendations = $recommendationService->getRecommendations($userId, $namespace);
if (empty($recommendations)) {
$recommendations = $this->getPopularItems($namespace);
}
How can I help you explore Laravel packages today?