Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/haiderjabbar/laravelsolr
A Laravel package for seamless integration with Apache Solr, providing easy-to-use commands for core management and a fluent interface for Solr operations.
https://github.com/haiderjabbar/laravelsolr
big-data elasticsearch laravel laravel-package search solr
Last synced: 4 days ago
JSON representation
A Laravel package for seamless integration with Apache Solr, providing easy-to-use commands for core management and a fluent interface for Solr operations.
- Host: GitHub
- URL: https://github.com/haiderjabbar/laravelsolr
- Owner: haiderjabbar
- Created: 2024-10-27T14:50:53.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2024-11-11T14:11:05.000Z (3 months ago)
- Last Synced: 2025-01-17T02:06:32.950Z (11 days ago)
- Topics: big-data, elasticsearch, laravel, laravel-package, search, solr
- Language: PHP
- Homepage:
- Size: 94.7 KB
- Stars: 58
- Watchers: 1
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# laravelsolr
![Laravel-Solr](https://github.com/haiderjabbar/laravelsolr/blob/main/laravelsolr.png?raw=true)A Laravel package for seamless integration with Apache Solr, providing easy-to-use commands for core management and a
fluent interface for Solr operations.## Features
- Create, update, and delete Solr cores via artisan commands
- Manage Solr fields with parent-child relationships
- Fluent query builder interface for Solr searches
- Support for parent-child document relationships
- Cross-collection joins
- Faceted search capabilities
- Complete test coverage## Installation
```bash
composer require haiderjabbar/laravelsolr:dev-main
```Add the service provider to your `config/app.php`:
```php
'providers' => [
// ...
HaiderJabbar\LaravelSolr\LaravelSolrServiceProvider::class,
];
```You should publish the config/solr.php config file with:
```bash
php artisan vendor:publish --provider="HaiderJabbar\LaravelSolr\LaravelSolrServiceProvider"
```## Available Commands
```bash
# Create a new Solr core and migration file
php artisan solr:create-core coreName# Update a Solr core with a new name
php artisan solr:update-core# Delete a Solr core and its migration file
php artisan solr:delete-core coreName# Create new Solr fields with optional parent and fields
php artisan solr:create-fields coreName# Update existing Solr core fields
php artisan solr:update-fields# Delete fields from a Solr core
php artisan solr:delete-fields```
## Basic Usage
### Adding Documents
```php
use HaiderJabbar\LaravelSolr\Models\SolrModel;$coreName = 'your_core_name';
$data = [
'id' => 'unique_id',
'name' => 'document_name',
// ... other fields
];$result = SolrModel::addDocument($coreName, $data);
```### Updating Documents
```php
$result = SolrModel::updateDocument($coreName, $data);
```### Deleting Documents
```php
$result = SolrModel::deleteDocumentById($coreName, $id);
```### Parent-Child Document Operations
```php
// Add child documents to a parent
$result = SolrModel::addChildToParent($coreName, $parentId, "child", $childData);
```### Controller Example
```php
use HaiderJabbar\LaravelSolr\Services\SolrQueryBuilder;
use Illuminate\Http\Request;
use HaiderJabbar\LaravelSolr\Models\SolrModel;class SolrController extends Controller
{
public function addDocument(Request $request)
{
$coreName = 'testCore';
$data = [
'id' => 1,
'name' => 'name'
];
$result = SolrModel::addDocument($coreName, $data);
return $result
? response()->json(['message' => 'Document added successfully'])
: response()->json(['message' => 'Failed to add document'], 500);
}public function addChildDocument(Request $request, $parentId)
{
$coreName = 'testCore';
$childData = $request->input('childData');
$result = SolrModel::addChildToParent($coreName, $parentId, "child", $childData);if ($result) {
return response()->json(['message' => 'Child documents added successfully']);
}
return response()->json(['message' => 'Failed to add child documents'], 500);
}
}
```## Query Builder
laravelsolr provides a powerful and fluent interface for building Solr queries through the `SolrQueryBuilder` class:
### Basic Usage
```php
use HaiderJabbar\LaravelSolr\Services\SolrQueryBuilder;$builder = new SolrQueryBuilder($coreName);
```### Search Methods
```php
// Basic search
$builder->search('field', '=', 'value', $boost);// OR search condition
$builder->orSearch('field', 'value', $boost);// Where clause
$builder->where('field', '=', 'value', $priority);// OR where clause
$builder->orWhere('field', '=', 'value', $priority);// WHERE IN clause
$builder->whereIn('field', ['value1', 'value2']);// Filter (fq parameter)
$builder->filter('field', '=', 'value');
```Available operators:
- `=` Exact match
- `!=` Not equal
- `<` Less than
- `>` Greater than
- `<=` Less than or equal
- `>=` Greater than or equal
- `like` Contains
- `in` In array of values### Sorting and Pagination
```php
$builder
->sort('field asc') // Add sorting
->start(0) // Starting offset (pagination)
->rows(10); // Number of rows to return
```### Field Selection
```php
$builder->fl(['field1', 'field2', 'score']); // Select specific fields to return
```### Parent-Child Document Queries
```php
// Get parent with child
$builder
->whereParent('id', '=', 'parent_id', 20)
->returnBothParentAndChild()
->get();// Get only children
$builder
->whereParent('id', '=', 'parent_id', 20)
->returnOnlyChild()
->fl(['*', 'score'])
->get();// Get parent only
$builder
->whereParent('id', '=', 'parent_id', 20)
->returnOnlyParent()
->get();// Query where parent and child
$builder
->whereParent('id', '=', 'parent_id', 20)
->whereChild('childId', '=', 'child_id', 20)
->get();
```### Cross-Collection Joins
```php
// Simple join
$builder->crossCollectionJoin(
'otherCore', // From index
'fromField', // Field in from index
'toField', // Field in current index
'field:value' // Optional query
);// Complex join with conditions
$builder->whereJoin('otherCore', 'fromField', 'toField', function($q) {
$q->where('field1', '=', 'value1')
->where('field2', '=', 'value2');
});// Cross collection join example
$result = $builder
->whereParent('id', '=', 'parent_id', 20)
->whereJoin('otherCore', 'id', 'id', function ($q) {
$q->where("id", "=", "value1", 20)
->where("id", "=", "value2", 20);
})
->returnBothParentAndChild()
->getWithJoinedDocuments("otherCore", "id", "id");
```### Faceted Search
```php
// Basic faceted search
$builder
->facet(true)
->facetFields(['field1', 'field2'])
->get();// Complex faceted search
$builder
->whereParent('id', '=', 'parent_id', 20)
->whereChild('childId', '=', 'child_id', 20)
->facetFields(['id'])
->facet(true)
->fl(['*', 'score'])
->get();
```### Query Execution
```php
// Basic query execution
$results = $builder->get();// Get results with facets
$results = $builder->getWithFacets();// Get results with joined documents
$results = $builder->getWithJoinedDocuments('otherCore', 'fromId', 'toId');
```### Complete Example
```php
$builder = new SolrQueryBuilder($coreName);$results = $builder
->whereParent('category', '=', 'electronics', 20)
->whereChild('price', '>=', 100)
->facet(true)
->facetFields(['brand', 'color'])
->sort('price desc')
->start(0)
->rows(20)
->fl(['id', 'name', 'price', 'score'])
->returnBothParentAndChild()
->get();
```### Environment Configuration
Make sure to set your Solr URL in your `.env` file:
```env
SOLR_URL=http://localhost:8983/solr
```## Directory Structure
```
laravelsolr/
├── src/
│ ├── Console/Commands/
│ │ ├── CreateSolrCore.php
│ │ ├── CreateSolrFields.php
│ │ ├── DeleteSolrCore.php
│ │ ├── DeleteSolrFields.php
│ │ ├── UpdateSolrCore.php
│ │ └── UpdateSolrFields.php
│ ├── Models/
│ │ └── SolrModel.php
│ ├── Schema/
│ │ └── SolrSchemaBuilder.php
│ ├── Services/
│ │ ├── CoreSolrService.php
│ │ ├── FieldsSolrService.php
│ │ └── SolrQueryBuilder.php
│ ├── laravelsolr.php
│ ├── LaravelSolrServiceProvider.php
│ └── SolrServiceProvider.php
└── tests/
└── Unit/
├── Console/Commands/
├── Models/
└── Services/
```## Testing
The package includes comprehensive tests for all features. To run the tests:
```bash
vendor/bin/phpunit
```## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
This package is open-source software licensed under the MIT license.