PHPackages                             romanstruk/solr-scout-engine - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. romanstruk/solr-scout-engine

ActiveLibrary[Search &amp; Filtering](/categories/search)

romanstruk/solr-scout-engine
============================

Laravel Solr Scout Engine (Solarium driver for Laravel Scout)

v1.0.1(4w ago)09—0%MITPHPPHP ^8.2

Since Jun 14Pushed 4w agoCompare

[ Source](https://github.com/RomanStruk/solr-scout-engine)[ Packagist](https://packagist.org/packages/romanstruk/solr-scout-engine)[ RSS](/packages/romanstruk-solr-scout-engine/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (3)Dependencies (12)Versions (4)Used By (0)

Solr Scout Engine
=================

[](#solr-scout-engine)

Laravel Scout driver for Apache Solr, built on top of [Solarium](https://github.com/solariumphp/solarium).

Requirements
------------

[](#requirements)

- PHP `^8.2`
- Laravel `^10` / `^11`
- Laravel Scout `^10`
- Solarium `^6.2`

Installation
------------

[](#installation)

```
composer require romanstruk/solr-scout-engine
php artisan vendor:publish --tag=solr-config
```

Set the driver in `.env`:

```
SCOUT_DRIVER=solr
SOLR_HOST=127.0.0.1
SOLR_PORT=8983
SOLR_PATH=/
SOLR_CONFIGSET="my_configset"   # used by solr:index / createIndex
```

The Solr **core** is resolved per model from `searchableAs()`.

Indexing a model
----------------

[](#indexing-a-model)

Use Solr dynamic field suffixes in `toSearchableArray()` (`_s`, `_ss`, `_i`, `_is`, `_f`, `_b`, `_txt_xx`):

```
use Laravel\Scout\Searchable;

class Product extends Model
{
    use Searchable;

    public function searchableAs(): string
    {
        return 'products';
    }

    public function toSearchableArray(): array
    {
        return [
            'name_txt_uk' => $this->name,
            'price_f'     => (float) $this->price,
            'active_b'    => (int) $this->active,
            'categories_is' => $this->category_ids,
        ];
    }
}
```

Sync as usual: `php artisan scout:import "App\Models\Product"`.

Searching
---------

[](#searching)

Simple Scout API:

```
Product::search('apple')
    ->where('active_b', 1)
    ->whereIn('categories_is', [1, 2])
    ->orderBy('price_f', 'asc')
    ->paginate(30);
```

Full control via the search callback — you receive the Solarium `Select\Query\Query`, mutate it (EDisMax, boosts, filter queries, JSON facets…) and return it:

```
use Solarium\QueryType\Select\Query\Query;
use Solarium\Component\DisMax\BoostQuery;

Product::search($term, function (Query $query, string $search) {
    $query->setQuery("name_txt_uk:({$search})");
    $query->getEDisMax()->addBoostQuery(
        (new BoostQuery())->setQuery('status_s:in_stock')->setKey('status')
    );
    $query->getFacetSet()->createFacetField('brand')->setField('brand_ss');

    return $query;
})->paginate(30);
```

### Facets

[](#facets)

After a search, facets from the last result are available via a `Collection`macro:

```
$products = Product::search('apple', $callback)->paginate(30);
$facets = collect()->getFacetSet(); // normalised array (supports pivot facets)
```

Index management (standalone &amp; SolrCloud)
---------------------------------------------

[](#index-management-standalone--solrcloud)

The package works with both Solr modes. Pick one in `.env`:

```
SOLR_MODE="core"    # standalone: indexes are cores (CoreAdmin API)
# SOLR_MODE=cloud # SolrCloud: indexes are collections (Collections API)
```

Create the index for a model:

```
php artisan solr:index "App\Models\Product"
# override per call:
php artisan solr:index "App\Models\Product" --mode=cloud --configset=products
```

- **core** — creates a core via CoreAdmin using the on-disk configset `SOLR_CONFIGSET` (must already exist under `server/solr/configsets/`).
- **cloud** — creates a collection via the Collections API with `collection.configName = SOLR_CONFIGSET`, `numShards`, `replicationFactor`(`SOLR_NUM_SHARDS`, `SOLR_REPLICATION_FACTOR`, or per-call `['num_shards' => .., 'replication_factor' => ..]`).

The engine exposes `createIndex($name, $options)` and `deleteIndex($name, $options)`. Both honour `mode`/`configset` overrides via `$options`.

### Uploading a configset (SolrCloud only)

[](#uploading-a-configset-solrcloud-only)

In cloud mode configsets live in ZooKeeper and are uploaded over the Configsets API. The package zips a local directory (files at the zip root, `solrconfig.xml`on top) and uploads it:

```
php artisan solr:configset products
# from a model (uses searchableAs as the name, solrConfigsetPath() if defined):
php artisan solr:configset --model="App\Models\Product"
# explicit folder + overwrite stale files:
php artisan solr:configset products --path=/path/to/conf --cleanup
```

Resolution of the source folder:

1. `--path` option, else
2. model `solrConfigsetPath()` (when `--model` given), else
3. `SOLR_CONFIGSET_PATH` base dir + `/{name}`.

```
SOLR_CONFIGSET_PATH=/var/www/app/solr/configsets
```

> Standalone Solr has no configset upload API — `solr:configset` refuses to run in `core` mode. Place the configset under `server/solr/configsets/` on the Solr server instead.

A model may pin its own configset directory:

```
public function solrConfigsetPath(): string
{
    return base_path('solr/configsets/products');
}
```

Testing
-------

[](#testing)

```
composer install
composer test
```

Tests run against an in-memory Solarium adapter (`tests/Fakes/FakeAdapter`) — no live Solr instance required.

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance94

Actively maintained with recent releases

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity48

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~9 days

Total

3

Last Release

28d ago

Major Versions

v0.1.0 → v1.0.02026-07-01

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/19497911?v=4)[Roman](/maintainers/RomanStruk)[@RomanStruk](https://github.com/RomanStruk)

---

Top Contributors

[![RomanStruk](https://avatars.githubusercontent.com/u/19497911?v=4)](https://github.com/RomanStruk "RomanStruk (5 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/romanstruk-solr-scout-engine/health.svg)

```
[![Health](https://phpackages.com/badges/romanstruk-solr-scout-engine/health.svg)](https://phpackages.com/packages/romanstruk-solr-scout-engine)
```

###  Alternatives

[jeroen-g/explorer

Next-gen Elasticsearch driver for Laravel Scout.

399672.8k](/packages/jeroen-g-explorer)[rapidez/core

Rapidez Core

1823.5k73](/packages/rapidez-core)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
