minimalcode/search
Single-class PHP library for building powerful q="" query strings for Solr/Lucene. Compose and combine search criteria programmatically for clean, flexible queries in your apps; lightweight API focused on constructing Solr search expressions.
Installation
composer require minimalcode/search
Ensure sorl/pecl-solr is installed in your PHP environment.
Basic Setup
require __DIR__ . '/vendor/autoload.php';
use MinimalCode\Search\Criteria;
$criteria = new Criteria();
First Use Case: Simple Search
$query = $criteria
->addField('title', 'Laravel')
->addField('description', 'PHP Framework')
->getQuery();
Use $query with Sorl\Lucene to execute the search.
Where to Look First
src/MinimalCode/Search/Criteria.php for core logic and available methods.Leverage method chaining for readability and maintainability:
$query = (new Criteria())
->addField('author', 'Taylor Otwell')
->addField('tags', 'laravel,php')
->addBoost('title', 2.0)
->addRange('price', 10, 100)
->getQuery();
Dynamic Field Filtering
$fields = ['title', 'content', 'tags'];
$criteria = new Criteria();
foreach ($fields as $field) {
$criteria->addField($field, $searchTerm);
}
Geospatial Queries
$criteria
->addGeoDistance('location', '37.7749,-122.4194', 5, 'km')
->addGeoFilter('location', '37.7749,-122.4194', 10, 'km');
Faceted Search Combine with Sorl\Lucene’s faceting:
$query = $criteria->addField('category', 'books')->getQuery();
$results = $solr->query($query)->getFacet('category');
Integration with Laravel Use in a service layer or repository:
class SearchService {
public function search(string $query, array $fields): string {
$criteria = new Criteria();
foreach ($fields as $field) {
$criteria->addField($field, $query);
}
return $criteria->getQuery();
}
}
addField() to avoid injection.\Log::debug('Solr Query:', ['query' => $criteria->getQuery()]);
Deprecated Sorl Version
Geodist Bug
1.0.1, but negative geodist values may still cause issues.addGeoDistance().No SolrCloud Support
Limited Error Handling
try {
$query = $criteria->addField('invalid_field', 'value')->getQuery();
} catch (\Exception $e) {
\Log::error('Search Criteria Error:', ['error' => $e->getMessage()]);
return null;
}
$solr->setLogger(new \Monolog\Logger('solr'));
Custom Operators
Extend the Criteria class to add custom Lucene operators:
class ExtendedCriteria extends Criteria {
public function addCustomOperator(string $field, string $operator, string $value): self {
$this->query .= " {$field}{$operator}\"{$value}\"";
return $this;
}
}
Field Normalization Preprocess fields before adding them to the query:
$criteria->addField('normalized_' . strtolower($field), $value);
Plugin Integration Combine with Laravel Scout or other search packages as a query builder:
public function toScoutQueryBuilder($query) {
return $query->where('solr_query', $this->criteria->getQuery());
}
1.0. Explicitly set boosts for critical fields.text vs. text_en). Configure these in your schema.xml.$cacheKey = md5($criteria->getQuery());
$cachedQuery = \Cache::get($cacheKey);
How can I help you explore Laravel packages today?