PHPackages                             roadiz/solr-bundle - 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. [Admin Panels](/categories/admin)
4. /
5. roadiz/solr-bundle

ActiveSymfony-bundle[Admin Panels](/categories/admin)

roadiz/solr-bundle
==================

v2.7.36(2w ago)01.1kMITPHPPHP &gt;=8.3CI failing

Since Aug 6Pushed 2w agoCompare

[ Source](https://github.com/roadiz/solr-bundle)[ Packagist](https://packagist.org/packages/roadiz/solr-bundle)[ RSS](/packages/roadiz-solr-bundle/feed)WikiDiscussions develop Synced 2w ago

READMEChangelogDependencies (161)Versions (76)Used By (0)

Roadiz Solr Search engine bundle
================================

[](#roadiz-solr-search-engine-bundle)

[![Run test status](https://github.com/roadiz/solr-bundle/actions/workflows/run-test.yml/badge.svg?branch=develop)](https://github.com/roadiz/solr-bundle/actions/workflows/run-test.yml/badge.svg?branch=develop)

Installation
============

[](#installation)

Make sure Composer is installed globally, as explained in the [installation chapter](https://getcomposer.org/doc/00-intro.md)of the Composer documentation.

Applications that use Symfony Flex
----------------------------------

[](#applications-that-use-symfony-flex)

Open a command console, enter your project directory and execute:

```
$ composer require roadiz/solr-bundle
```

Applications that don't use Symfony Flex
----------------------------------------

[](#applications-that-dont-use-symfony-flex)

### Step 1: Download the Bundle

[](#step-1-download-the-bundle)

Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:

```
$ composer require roadiz/solr-bundle
```

### Step 2: Enable the Bundle

[](#step-2-enable-the-bundle)

Then, enable the bundle by adding it to the list of registered bundles in the `config/bundles.php` file of your project:

```
// config/bundles.php

return [
    // ...
    \RZ\Roadiz\SolrBundle\RoadizSolrBundle::class => ['all' => true],
];
```

Configuration
-------------

[](#configuration)

### Docker compose

[](#docker-compose)

Here is an example using docker compose to run Solr Cloud in your project:

```
services:
    # ...
    solr:
        image: solr:9-slim
        volumes:
            - solr:/var/solr
        environment:
            ZK_HOST: "zookeeper:2181"
        depends_on: [ zookeeper ]

    zookeeper:
        image: pravega/zookeeper:0.2.15
        volumes:
            - zookeeper-data:/data
            - zookeeper-datalog:/datalog
            - zookeeper-logs:/logs
        environment:
            ZOO_4LW_COMMANDS_WHITELIST: mntr,conf,ruok

volumes:
    # ...
    solr:
    zookeeper-data:
    zookeeper-datalog:
    zookeeper-logs:
```

### DotEnv variables

[](#dotenv-variables)

```
###> nelmio/solarium-bundle ###
SOLR_HOST=solr
SOLR_PORT=8983
SOLR_PATH=/
SOLR_CORE_NAME=roadiz
# For Solr Cloud, use the collection name instead of core name
SOLR_COLLECTION_NAME=roadiz
SOLR_COLLECTION_NUM_SHARDS=1
SOLR_COLLECTION_REPLICATION_FACTOR=1
SOLR_SECURE=0
###< nelmio/solarium-bundle ###
```

### Solarium config

[](#solarium-config)

Update `nelmio/solarium-bundle` default **config**

```
# config/packages/nelmio_solarium.yaml
nelmio_solarium:
    endpoints:
        default:
            # We use Solr Cloud with collection
            host: '%env(SOLR_HOST)%'
            port: '%env(int:SOLR_PORT)%'
            path: '%env(SOLR_PATH)%'
            core: '%env(SOLR_CORE_NAME)%'
            #core: '%env(SOLR_COLLECTION_NAME)%'
    clients:
        default:
            endpoints: [default]
            # You can customize the http timeout (in seconds) here. The default is 5sec.
            adapter_timeout: 5
```

Configure fuzzy search options in a dedicated `roadiz_solr` config file:

```
# config/packages/roadiz_solr.yaml
roadiz_solr:
    search:
        fuzzy_proximity: 2
        fuzzy_min_term_length: 3
```

You can use Solr Cloud with a collection instead of a core by setting the `SOLR_COLLECTION_NAME` environment variable and commenting the `core` line. Then you will need to set the `SOLR_COLLECTION_NUM_SHARDS` and `SOLR_COLLECTION_REPLICATION_FACTOR` variables to configure your collection and execute `solr:init` command to create the collection.

Fuzzy search options should now be configured in `roadiz_solr.search`. For backward compatibility, `roadiz_core.solr.search` is still read as a fallback during migration.

#### Extending Solr configuration

[](#extending-solr-configuration)

If you want to add/remove fields and update filters you can add an event-subscriber to the `RZ\Roadiz\SolrBundle\Event\SolrInitializationEvent` event. An abstract subscriber is provided in the bundle to provide helper methods to add fields and filters: `RZ\Roadiz\SolrBundle\EventListener\AbstractSolrInitializationSubscriber`.

### Initialize Solr Core or Collection

[](#initialize-solr-core-or-collection)

```
# Initialize Solr collection (for Solr Cloud)
bin/console solr:init

# Reindex all NodesSources
bin/console solr:reindex
```

### Drop Solr Collection

[](#drop-solr-collection)

```
bin/console solr:drop
```

### Api Resources

[](#api-resources)

Expose the `NodesSourcesSearchController` at `/api/search` by declaring the `SearchResultItem` resource. It is a **virtual, read-only** resource: it has no identifier and no item operation, so every result is serialized with a unique skolem IRI (`/.well-known/genid/...`) and the matched entity is nested under the `item` property, alongside its `highlighting`.

```
# config/api_resources/search.yml
resources:
    RZ\Roadiz\SolrBundle\SearchResultItem:
        shortName: SearchResultItem
        description: 'A single Solr search result, wrapping a matched resource and its highlighting.'
        types:
            - SearchResultItem
        # Virtual, read-only resource: no identifier and no item operation, so each
        # member is serialized with a unique skolem IRI (`/.well-known/genid/...`).
        stateless: true
        operations:
            search_collection:
                class: ApiPlatform\Metadata\GetCollection
                method: 'GET'
                uriTemplate: '/search'
                controller: RZ\Roadiz\SolrBundle\Controller\NodesSourcesSearchController
                read: false
                normalizationContext:
                    groups:
                        - get
                        - nodes_sources_base
                        - nodes_sources_default
                        - urls
                        - tag_base
                        - translation_base
                        - document_display
                openapi:
                    summary: Search NodesSources resources
                    description: |
                        Search all website NodesSources resources using **Solr** full-text search engine
                    tags:
                        - Search
                    parameters:
                        -   type: string
                            name: search
                            in: query
                            required: true
                            description: Search pattern
                            schema:
                                type: string
                        -   name: tag_name
                            in: query
                            required: false
                            description: |
                                Filter search results on one or more visible tag names (matches the
                                `facet_tags_ss` facet). Repeat the param to filter on several tags.
                            schema:
                                type: array
                                items:
                                    type: string
                            style: form
                            explode: true
                        -   name: node_type
                            in: query
                            required: false
                            description: |
                                Filter search results on one or more node types (matches the
                                `node_type_s` facet). Only node types within the endpoint allowlist
                                are returned. Repeat the param to filter on several node types.
                            schema:
                                type: array
                                items:
                                    type: string
                            style: form
                            explode: true
```

> **Migrating from `/nodes_sources/search`:** the operation moved from the `NodesSources` resource (`/api/nodes_sources/search`) to a dedicated `SearchResultItem` resource at `/api/search`. Update your front-end calls and read the matched entity from the `item` property of each `hydra:member`.

#### Content visibility

[](#content-visibility)

By default the endpoint only returns **published** content: the handler applies `node_status_i:PUBLISHED` and `published_at_dt:[* TO NOW/MINUTE]`, hiding drafts, pending and not-yet-published (embargoed) content. With a valid preview token, `NodesSourcesSearchController::getCriteria()` widens the query to `status
