{"id":4415,"date":"2025-01-08T06:00:32","date_gmt":"2025-01-08T06:00:32","guid":{"rendered":"https:\/\/www.rcvtechnologies.com\/blog\/?p=4415"},"modified":"2025-01-08T07:12:02","modified_gmt":"2025-01-08T07:12:02","slug":"getting-started-with-laravel-solr-a-practical-guide","status":"publish","type":"post","link":"https:\/\/www.rcvtechnologies.com\/blog\/getting-started-with-laravel-solr-a-practical-guide\/","title":{"rendered":"Getting Started with Laravel Solr: A Practical Guide"},"content":{"rendered":"<h1>Integrating Apache Solr with Laravel: A Complete Guide<\/h1>\n<h2>Introduction<\/h2>\n<p>In modern web applications, implementing robust search functionality is crucial. While Laravel provides built-in search capabilities, complex applications often require more sophisticated solutions. This guide will walk you through integrating Apache Solr with Laravel using the Solarium package to create a powerful search system.<\/p>\n<hr \/>\n<h2>Why Choose Solr for Laravel?<\/h2>\n<h3>Laravel&#8217;s Native Search vs Solr<\/h3>\n<p>Laravel&#8217;s built-in search capabilities work well for basic needs, but Solr offers several advantages:<\/p>\n<ol>\n<li><strong>Advanced Search Features:<\/strong>\n<ul>\n<li>Full-text search with complex queries<\/li>\n<li>Faceted search capabilities<\/li>\n<li>Geospatial search<\/li>\n<li>Suggestion\/autocomplete functionality<\/li>\n<\/ul>\n<\/li>\n<li><strong>Performance Benefits:<\/strong>\n<ul>\n<li>Highly scalable for millions of records<\/li>\n<li>Fast query response times<\/li>\n<li>Efficient index management<\/li>\n<li>Built-in caching<\/li>\n<\/ul>\n<\/li>\n<li><strong>Additional Features:<\/strong>\n<ul>\n<li>Custom scoring and relevance<\/li>\n<li>Advanced text analysis<\/li>\n<li>Multiple language support<\/li>\n<li>Real-time indexing<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<hr \/>\n<h2>Setting Up Your Environment<\/h2>\n<h3>Prerequisites<\/h3>\n<ol>\n<li>PHP 8.1 or higher<\/li>\n<li>Laravel 10.x<\/li>\n<li>Apache Solr 8.11.2<\/li>\n<li>Composer<\/li>\n<\/ol>\n<hr \/>\n<h3>Step 1: Installing Solr<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\"># Download Solr\r\nwget https:\/\/downloads.apache.org\/lucene\/solr\/8.11.2\/solr-8.11.2.tgz\r\ntar xzf solr-8.11.2.tgz\r\ncd solr-8.11.2\r\n\r\n# Start Solr\r\nbin\/solr start\r\n\r\n# Create a new core\r\nbin\/solr create -c articles<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<hr \/>\n<h3>Step 2: Creating a New Laravel Project<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">composer create-project laravel\/laravel laravel-solr-demo\r\ncd laravel-solr-demo<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<h3>Step 3: Installing Required Packages<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">composer require solarium\/solarium<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<hr \/>\n<h2>Implementation Guide<\/h2>\n<h3>Step 1: Setting Up the Service Provider<\/h3>\n<p>Create a new service provider to manage the Solr client:<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">php artisan make:provider SolrServiceProvider<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<p>Add the following configuration:<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">namespace App\\Providers;  \r\nuse Illuminate\\Support\\ServiceProvider; \r\nuse Solarium\\Client; \r\nuse Solarium\\Core\\Client\\Adapter\\Curl; \r\nuse Symfony\\Component\\EventDispatcher\\EventDispatcher;  \r\nclass SolrServiceProvider extends ServiceProvider {  \r\n     public function register()  {  \r\n       $this-&gt;app-&gt;singleton(Client::class, function($app) {  \r\n         $adapter = new Curl();  $eventDispatcher = new EventDispatcher();   \r\n         return new Client($adapter, $eventDispatcher, \r\n           [  \r\n             'endpoint' =&gt; [  'localhost' =&gt; \r\n             [   \r\n               'host' =&gt; env('SOLR_HOST', '127.0.0.1'),  \r\n               'port' =&gt; env('SOLR_PORT', '8983'),  \r\n               'path' =&gt; env('SOLR_PATH', '\/solr\/'),  \r\n                'core' =&gt; env('SOLR_CORE', 'articles')  \r\n             ]  \r\n           ]\r\n       ]);  \r\n   });  \r\n } \r\n}<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<hr \/>\n<h3>Step 2: Creating the Solr Service<\/h3>\n<p>This service will handle all Solr operations:<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">namespace App\\Services;\r\n\r\nuse Solarium\\Client;\r\nuse App\\Models\\Article;\r\n\r\nclass SolrService\r\n{\r\n    protected $client;\r\n\r\n    public function __construct(Client $client)\r\n    {\r\n        $this-&gt;client = $client;\r\n    }\r\n\r\n    public function indexArticle(Article $article)\r\n    {\r\n        $update = $this-&gt;client-&gt;createUpdate();\r\n        $doc = $update-&gt;createDocument();\r\n        \r\n        $doc-&gt;id = $article-&gt;id;\r\n        $doc-&gt;title = $article-&gt;title;\r\n        $doc-&gt;content = $article-&gt;content;\r\n        $doc-&gt;author = $article-&gt;author;\r\n        $doc-&gt;category = $article-&gt;category;\r\n        $doc-&gt;tags = $article-&gt;tags;\r\n        $doc-&gt;published_at = $article-&gt;published_at-&gt;format('Y-m-d\\TH:i:s\\Z');\r\n        \r\n        $update-&gt;addDocument($doc);\r\n        $update-&gt;addCommit();\r\n        \r\n        return $this-&gt;client-&gt;update($update);\r\n    }\r\n\r\n    public function search(string $query, array $filters = [], int $page = 1, int $perPage = 10)\r\n    {\r\n        $select = $this-&gt;client-&gt;createSelect();\r\n        \r\n        \/\/ Set basic query\r\n        if (!empty($query)) {\r\n            $select-&gt;setQuery($query);\r\n        }\r\n\r\n        \/\/ Add filters\r\n        if (!empty($filters)) {\r\n            $filterQuery = $select-&gt;createFilterQuery('filters');\r\n            $filterQueries = [];\r\n            \r\n            foreach ($filters as $field =&gt; $value) {\r\n                if (!empty($value)) {\r\n                    $filterQueries[] = \"$field:\\\"$value\\\"\";\r\n                }\r\n            }\r\n            \r\n            if (!empty($filterQueries)) {\r\n                $filterQuery-&gt;setQuery(implode(' AND ', $filterQueries));\r\n            }\r\n        }\r\n\r\n        \/\/ Add faceting\r\n        $facetSet = $select-&gt;getFacetSet();\r\n        $facetSet-&gt;createFacetField('category')-&gt;setField('category');\r\n        $facetSet-&gt;createFacetField('author')-&gt;setField('author');\r\n\r\n        \/\/ Set pagination\r\n        $select-&gt;setStart(($page - 1) * $perPage)-&gt;setRows($perPage);\r\n\r\n        \/\/ Execute query\r\n        $result = $this-&gt;client-&gt;select($select);\r\n        \r\n        return [\r\n            'total' =&gt; $result-&gt;getNumFound(),\r\n            'documents' =&gt; array_map(function($doc) {\r\n                return [\r\n                    'id' =&gt; $doc-&gt;id,\r\n                    'title' =&gt; $doc-&gt;title,\r\n                    'content' =&gt; $doc-&gt;content,\r\n                    'author' =&gt; $doc-&gt;author,\r\n                    'category' =&gt; $doc-&gt;category,\r\n                    'published_at' =&gt; $doc-&gt;published_at\r\n                ];\r\n            }, $result-&gt;getDocuments()),\r\n            'facets' =&gt; [\r\n                'category' =&gt; $result-&gt;getFacetSet()-&gt;getFacet('category')-&gt;getValues(),\r\n                'author' =&gt; $result-&gt;getFacetSet()-&gt;getFacet('author')-&gt;getValues(),\r\n            ]\r\n        ];\r\n    }\r\n\r\n    public function suggest(string $query)\r\n    {\r\n        $suggester = $this-&gt;client-&gt;createSuggester();\r\n        $suggester-&gt;setDictionary('suggest');\r\n        $suggester-&gt;setQuery($query);\r\n        $suggester-&gt;setCount(5);\r\n        \r\n        $result = $this-&gt;client-&gt;suggester($suggester);\r\n        \r\n        return $result-&gt;getAllSuggestions();\r\n    }\r\n\r\n    public function deleteFromIndex($id)\r\n    {\r\n        $update = $this-&gt;client-&gt;createUpdate();\r\n        $update-&gt;addDeleteById($id);\r\n        $update-&gt;addCommit();\r\n        \r\n        return $this-&gt;client-&gt;update($update);\r\n    }\r\n}<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<hr \/>\n<h3>Step 3: Setting Up the Model<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">namespace App\\Models;\r\n\r\nuse Illuminate\\Database\\Eloquent\\Model;\r\n\r\nclass Article extends Model\r\n{\r\n    protected $fillable = [\r\n        'title',\r\n        'content',\r\n        'author',\r\n        'category',\r\n        'tags',\r\n        'published_at'\r\n    ];\r\n\r\n    protected $casts = [\r\n        'published_at' =&gt; 'datetime',\r\n        'tags' =&gt; 'array'\r\n    ];\r\n}<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<hr \/>\n<h3>Step 4: Creating the Search Controller<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">namespace App\\Http\\Controllers;\r\n\r\nuse App\\Services\\SolrService;\r\nuse Illuminate\\Http\\Request;\r\n\r\nclass SearchController extends Controller\r\n{\r\n    protected $solrService;\r\n\r\n    public function __construct(SolrService $solrService)\r\n    {\r\n        $this-&gt;solrService = $solrService;\r\n    }\r\n\r\n    public function search(Request $request)\r\n    {\r\n        $validated = $request-&gt;validate([\r\n            'q' =&gt; 'nullable|string',\r\n            'category' =&gt; 'nullable|string',\r\n            'author' =&gt; 'nullable|string',\r\n            'page' =&gt; 'nullable|integer|min:1',\r\n        ]);\r\n\r\n        $results = $this-&gt;solrService-&gt;search(\r\n            $validated['q'] ?? '*:*',\r\n            array_filter([\r\n                'category' =&gt; $validated['category'] ?? null,\r\n                'author' =&gt; $validated['author'] ?? null,\r\n            ]),\r\n            $validated['page'] ?? 1\r\n        );\r\n\r\n        return response()-&gt;json($results);\r\n    }\r\n\r\n    public function suggest(Request $request)\r\n    {\r\n        $validated = $request-&gt;validate([\r\n            'q' =&gt; 'required|string|min:2'\r\n        ]);\r\n\r\n        $suggestions = $this-&gt;solrService-&gt;suggest($validated['q']);\r\n        \r\n        return response()-&gt;json($suggestions);\r\n    }\r\n}<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<pre><\/pre>\n<h2>Key Features Implementation<\/h2>\n<h3>1. Basic Search<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">public function search(string $query)\r\n{\r\n    $select = $this-&gt;client-&gt;createSelect();\r\n    $select-&gt;setQuery($query);\r\n    return $this-&gt;client-&gt;select($select);\r\n}<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<pre><\/pre>\n<hr \/>\n<h3>2. Faceted Search<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">$facetSet = $select-&gt;getFacetSet();\r\n$facetSet-&gt;createFacetField('category')-&gt;setField('category');\r\n$facetSet-&gt;createFacetField('author')-&gt;setField('author');<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<hr \/>\n<h3>3. Filtered Search<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">$filterQuery = $select-&gt;createFilterQuery('filters');\r\n$filterQuery-&gt;setQuery(\"category:\\\"$category\\\"\");<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<hr \/>\n<h2>Configuration<\/h2>\n<h3>Environment Setup<\/h3>\n<p>Add these variables to your <code>.env<\/code> file:<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">SOLR_HOST=127.0.0.1\r\nSOLR_PORT=8983\r\nSOLR_PATH=\/solr\/\r\nSOLR_CORE=articles<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<hr \/>\n<h3>Register Service Provider<\/h3>\n<p>Add to <code>config\/app.php<\/code>:<\/p>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">'providers' =&gt; [\r\n    App\\Providers\\SolrServiceProvider::class,\r\n],<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<pre><\/pre>\n<hr \/>\n<h2>Best Practices<\/h2>\n<ol>\n<li><strong>Index Management<\/strong>\n<ul>\n<li>Implement batch indexing for large datasets<\/li>\n<li>Use delta updates for real-time changes<\/li>\n<li>Regularly optimize your indexes<\/li>\n<\/ul>\n<\/li>\n<li><strong>Performance Optimization<\/strong>\n<ul>\n<li>Cache common queries<\/li>\n<li>Use field type optimization<\/li>\n<li>Implement proper error handling<\/li>\n<\/ul>\n<\/li>\n<li><strong>Search Experience<\/strong>\n<ul>\n<li>Implement proper highlighting<\/li>\n<li>Add spelling suggestions<\/li>\n<li>Use boost queries for better relevance<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<hr \/>\n<h2>Common Issues and Solutions<\/h2>\n<ol>\n<li><strong>Connection Issues<\/strong>\n<ul>\n<li>Verify Solr is running<\/li>\n<li>Check firewall settings<\/li>\n<li>Validate core name and path<\/li>\n<\/ul>\n<\/li>\n<li><strong>Performance Issues<\/strong>\n<ul>\n<li>Optimize index settings<\/li>\n<li>Use proper field types<\/li>\n<li>Implement caching<\/li>\n<\/ul>\n<\/li>\n<li><strong>Indexing Problems<\/strong>\n<ul>\n<li>Verify field mappings<\/li>\n<li>Check data types<\/li>\n<li>Monitor index size<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<hr \/>\n<h2>Testing the Implementation<\/h2>\n<h3>Unit Tests<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">public function test_basic_search()\r\n{\r\n    $result = $this-&gt;solrService-&gt;search('test query');\r\n    $this-&gt;assertNotNull($result);\r\n}<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<pre><\/pre>\n<hr \/>\n<h3>Feature Tests<\/h3>\n<div class=\"dm-code-snippet dark default  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Copy Code<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"no-line-numbers\"><code id=\"dm-code-raw\" class=\"no-wrap language-php\"><\/p>\n<pre class=\"dm-pre-admin-side\">public function test_search_endpoint()\r\n{\r\n    $response = $this-&gt;get('\/api\/search?q=test');\r\n    $response-&gt;assertStatus(200);\r\n}<\/pre>\n<p><\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n<pre><\/pre>\n<hr \/>\n<h2>Conclusion<\/h2>\n<p>Integrating Solr with Laravel using Solarium provides a powerful search solution for complex applications. While the setup requires more effort than using Laravel&#8217;s native search, the benefits in terms of performance, scalability, and features make it worthwhile for larger applications.<\/p>\n<hr \/>\n<h2>Resources<\/h2>\n<ul>\n<li><a href=\"https:\/\/solarium.readthedocs.io\/\">Solarium Documentation<\/a><\/li>\n<li><a href=\"https:\/\/solr.apache.org\/guide\/\">Apache Solr Documentation<\/a><\/li>\n<li><a href=\"https:\/\/laravel.com\/docs\">Laravel Documentation<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Integrating Apache Solr with Laravel: A Complete Guide Introduction In modern web applications, implementing robust search functionality is crucial. While Laravel provides built-in search capabilities, complex applications often require more sophisticated solutions. This guide will walk you through integrating Apache Solr with Laravel using the Solarium package to create a powerful search system. Why Choose [&hellip;]<\/p>\n","protected":false},"author":17,"featured_media":4416,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[332,195,3],"tags":[337,344,340,338,341,343,348,339,336,345,347,350,349,342,346],"class_list":["post-4415","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","category-optimization","category-technology","tag-advanced-search","tag-apache-solr","tag-faceted-search","tag-full-text-search","tag-geospatial-search","tag-laravel-development","tag-laravel-search-customization","tag-laravel-search-features","tag-laravel-solr","tag-laravel-solr-integration","tag-location-based-search","tag-scalable-search-solutions","tag-search-index-management","tag-search-optimization","tag-search-performance"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/4415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/users\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/comments?post=4415"}],"version-history":[{"count":4,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/4415\/revisions"}],"predecessor-version":[{"id":4421,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/posts\/4415\/revisions\/4421"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/media\/4416"}],"wp:attachment":[{"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/media?parent=4415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/categories?post=4415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rcvtechnologies.com\/blog\/wp-json\/wp\/v2\/tags?post=4415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}