在Laravel5.5中使用搜索 Elasticsearch

一: 安裝Elasticsearch和ik(中文插件)

直接GitHub地址下載:https://github.com/medcl/elasticsearch-rtf 須要聲明的是運行環境必須支持如下: 1:.JDK8+
2:系統可用內存>2Gphp

運行 Mac/Linux:前端

cd elasticsearch/bin
./elasticsearch
複製代碼

sudo -u ops ES_JAVA_OPTS="-Xms2024m -Xmx2024m" ./bin/elasticsearch -dlaravel

Windows:git

cd elasticsearch/bin
elasticsearch.bat
複製代碼

二: 安裝Elasticsearch的Laravel 的搜索系統 Scout

1: 首先,使用 composer 包管理器來安裝 Scout:github

composer require laravel/scout數據庫

接下來,你須要將 ScoutServiceProvider添加到你的配置文件 config/app.phpproviders數組中:json

Laravel\Scout\ScoutServiceProvider::class,數組

註冊好 Scout 的服務提供器以後,你還需使用Artisan 命令 vendor:publish 生成 Scout 的配置文件。這個命令會在你的 config 目錄下生成 scout.php 配置文件:bash

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"app

最後,將 Laravel\Scout\Searchable trait 加到你想要搜索的模型中。

2: 安裝 Laravel Scout Elasticsearch Driver

composer require tamayo/laravel-scout-elastic

// config/app.php
'providers' => [
    ...
    Laravel\Scout\ScoutServiceProvider::class,
    ...
    ScoutEngines\Elasticsearch\ElasticsearchProvider::class,
],
複製代碼

修改scout.php

// config/scout.php
    'driver' => env('SCOUT_DRIVER', 'elasticsearch'),

...
    'elasticsearch' => [
        'index' => env('ELASTICSEARCH_INDEX', 'laravel'),
        'hosts' => [
            env('ELASTICSEARCH_HOST', 'http://localhost:9200'),
        ],
    ],
...
複製代碼

三: 建立Elasticsearch的模板和索引

1: 使用laravel的Command實現搜索引擎索引和模版的創建

建立 PHP Artisan 命令 php artisan make:command ESInit

命令執行以後你會看到 app/console/commands/ESInit.php 新建立的文件。 修改此文件的一些內容以下:

// 執行腳本命令的名稱 
// 執行 php artisan es:init
protected $signature = 'es:init';

// 控制檯命令的描述,能夠是中文
 protected $description = '執行ES搜索的命令';
複製代碼

修改具體執行的方法 handle以前: 須要引入 use GuzzleHttp\Client;若是沒有此擴展包,能夠先下載以後引入 composer require guzzlehttp/guzzle

public function handle()
    {
        $client = new Client();
        // 建立模版
        $url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp';
       
        $client->put($url, [
            'json' => [
                'template' => config('scout.elasticsearch.index'),
                'settings' => [
                    'number_of_shards' => 1
                ],
                'mappings' => [
                    '_default_' => [
                        '_all' => [
                            'enabled' => true
                        ],
                        'dynamic_templates' => [
                            [
                                'strings' => [
                                    'match_mapping_type' => 'string',
                                    'mapping' => [
                                        'type' => 'text',
                                        'analyzer' => 'ik_smart',
                                        'ignore_above' => 256,
                                        'fields' => [
                                            'keyword' => [
                                                'type' => 'keyword'
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]);
        // 爲了方便看到執行結果
        $this->info("======= 建立模板成功 =======");
        $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
       
        $client->put($url, [
            'json' => [
                'settings' => [
                    'refresh_interval' => '5s',
                    'number_of_shards' => 1,
                    'number_of_replicas' => 0,
                ],
                'mappings' => [
                    '_default_' => [
                        '_all' => [
                            'enabled' => false
                        ]
                    ]
                ]
            ]
        ]);
        // 爲了方便看到執行結果
        $this->info("======= 建立索引成功 =======");
    }
複製代碼

而後在 app\Console\Kernel.php引入代碼以下:

protected $commands = [
        //
        \App\Console\Commands\ESInit::class
    ];
複製代碼

而後執行命令測試 php artisan es:init 若是你看到了

======= 建立模板成功 =======
======= 建立索引成功 =======
複製代碼

說明你命令已經建立成功,接下來在你想要使用搜索的模型中引入吧。

而後再你要使用的模型中引入並加入兩個方法 以下:(我是在Status模型下加入的)

use Laravel\Scout\Searchable;

class Status extends Model
{

	use Searchable;
	....
	
	// 定義索引裏面的 type
	public function searchableAs()
	{
		return "status";
	}

	// 定義有哪些字段須要 搜索
	public function toSearchableArray() 
	{
		return [
			'content' => $this->content
		];

	}
   ...
}
複製代碼

四: 新增數據和導入已有數據

以上都完成以後,就能夠導入數據庫中的進行搜索了。 執行命令 php artisan scout:import 模型名 好比 php artisan scout:import "App\Status" 能明顯看到你數據表中最大的ID是多少,當你看到相似以下的提示說明你已經導入成功了。

Imported [\App\Status] models up to ID: 52
All [\App\Status] records have been imported.
複製代碼

接下來你就能夠經過URl訪問來測試查看你要搜索的數據了。 url: http://127.0.0.1:9200/laravel/status/4 laravel 表明你本身建立的索引的名字,就是以下 :ELASTICSEARCH_INDEX 的名字

'elasticsearch' => [
        'index' => env('ELASTICSEARCH_INDEX', 'laravel'),
        'hosts' => [
            env('ELASTICSEARCH_HOST', 'http://localhost:9200'),
        ],
    ],
複製代碼

五: 搜索邏輯和數據展現

接下要作的就相對簡單了,新建一個路由以下: Route::get('status/search','StatusesController@search'); 新建一個對應的方法以下: // 搜索頁面

public function search()
{
	// 驗證提交的數據
    $this->validate(request(),[
      'query' => 'required'
    ]);
	
   $query = request('query');
   // 查詢
   $posts = Status::search(request('query'))->paginate(10);
   // 渲染
   return view('static_pages/search', compact('posts', 'query'));
}
複製代碼

前端頁面這裏就不寫了。就是基本的數據 foreach 渲染了。

相關文章
相關標籤/搜索