Installation:
composer require dama/solarium-bundle
Add to config/bundles.php (Symfony 4+):
return [
// ...
DAMA\SolariumBundle\DAMASolariumBundle::class => ['all' => true],
];
Basic Configuration (config/packages/dama_solarium.yaml):
dama_solarium:
endpoints:
default:
scheme: http
host: localhost
port: 8983
path: /solr
core: your_core_name
First Query (in a controller/service):
use Solarium\QueryType\Select\Query\Query;
$client = $this->get('solarium.client');
$select = $client->createSelect();
$select->setQuery('*:*');
$result = $client->select($select);
solarium.client (default client)dama_solarium:
clients:
default:
debug: true
// Basic select
$select = $client->createSelect();
$select->setQuery('search_term');
$select->setFields(['id', 'title', 'score']);
$select->setStart(0)->setRows(10);
$result = $client->select($select);
// Faceted search
$facetSet = $client->createFacetSet();
$facetSet->createFacet('categories')->setField('category');
$select->addFacetSet($facetSet);
// Add/update document
$update = $client->createUpdate();
$update->addDocument($document);
$update->addCommit();
$update->execute();
// Delete by ID
$update = $client->createUpdate();
$update->createDeleteQuery()->addQuery('id:123');
$update->addCommit();
$update->execute();
$select = $client->createSelect();
$select->setQuery('*:*')->setStart($page * $perPage)->setRows($perPage);
$result = $client->select($select);
# config/packages/dama_solarium.yaml
dama_solarium:
clients:
custom:
endpoints: [default]
options:
adapter: curl
timeout: 30
Access via service name: solarium.client.custom.
Inject the client directly into services:
use Solarium\Client;
class SearchService {
public function __construct(private Client $solarium) {}
}
Use Solarium for form-based searches:
// Controller
public function search(Request $request) {
$query = $request->get('q');
$select = $client->createSelect()->setQuery($query);
// ...
}
Trigger actions on Solarium events (e.g., post-query):
$client->getEventDispatcher()->addListener('solarium.query', function ($event) {
// Log queries or modify them
});
Cache Solarium results using Symfony’s cache system:
$cache = $this->get('cache.app');
$cacheKey = 'solr_results_' . md5($query);
if (!$cache->has($cacheKey)) {
$result = $client->select($select);
$cache->set($cacheKey, $result, 3600);
} else {
$result = $cache->get($cacheKey);
}
Deprecated Bundle:
nelmio/solarium-bundle for active maintenance.Endpoint Configuration:
core in endpoints will default to collection1 (Solr’s default), which may not exist.
dama_solarium:
endpoints:
default:
core: your_core_name # Critical!
Query Timeouts:
clients.options:
dama_solarium:
clients:
default:
options:
timeout: 60
Case Sensitivity:
lowercaseExpandedTerms="true" in select for case-insensitive searches:
$select->setQuery('foo')->setLowercaseExpandedTerms(true);
Debugging Queries:
dama_solarium:
clients:
default:
debug: true
q parameter).Solarium Debug Output:
Common Errors:
Connection refused: Verify Solr server is running (http://localhost:8983/solr).Unknown core: Double-check core in endpoint config.Invalid query: Validate syntax using Solr Query Syntax.Testing Locally:
docker run -p 8983:8983 solr:8.11
Custom Query Builders:
class CustomSelect extends \Solarium\QueryType\Select\Query\Select {
public function addHighlight($field) {
$this->highlighting->addField($field);
return $this;
}
}
Event Subscribers:
$client->getEventDispatcher()->addSubscriber(new class {
public function onQuery(\Solarium\Event\QueryEvent $event) {
$event->getQuery()->setQuery('*' . $event->getQuery()->getQuery());
}
});
Dynamic Endpoints:
# config/packages/dama_solarium.yaml
dama_solarium:
endpoints:
%env(resolve:SOLR_ENDPOINT)%: ~
Set SOLR_ENDPOINT in .env:
SOLR_ENDPOINT=http://solr-prod:8983/solr
Solr Schema Validation:
$schema = $client->getSchema();
if (!$schema->validate($document)) {
throw new \RuntimeException('Document validation failed');
}
How can I help you explore Laravel packages today?