Laravel 之搜尋引擎elasticsearch擴充套件Scout

曼巴童鞋發表於2017-11-26

部落格地址 : http://blog.mambaxin.com

簡介

Laravel Scout 是針對Eloquent 模型開發的一個簡單的,基於驅動的全文檢索系統。Scout 使用模型觀察者時會自動保持你的檢索索引與你的 Eloquent 記錄同步。

目前,Scout 帶著一個Algolia驅動;然而,擴充套件 Scout 並不難,你可以通過自定義驅動來自由的擴充套件 Scout。接下來我們就自定義搜尋引擎elasticsearch來擴充套件Scount。

ElasticSearch是一個基於Lucene的搜尋伺服器。它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎。

下載並安裝elasticsearch

下載地址

(1)使用elasticsearch的前提是你的主機必須安裝了java的JDK,而且版本必須是1.8以上。安裝JDK,並設定JAVA_HOME環境變數。

(2)解壓安裝包,使用cmd命令進入到\bin,首先我們可以使用命令elasticsearch-plugin list 檢視外掛,我們可以看到會列出一串的外掛,但是我們只需要其中analysis-ik外掛,如果你的主機不夠強大,建議可以刪除其他不必要的外掛,因為會消耗主機的大部分資源,直接刪除\plugins中除了analysis-ik的其他外掛。

(3)重新cmd鍵入elasticsearch-plugin list 檢視外掛

(4)啟動,cmd鍵入elasticsearch -d,在瀏覽器地址了中輸入127.0.0.1:9200,我們可以看到如下圖:

安裝Scout

(1)首先,使用 composer 包管理器來安裝 Scout,如果沒有安裝 composer 包管理器,要先安裝;接著進入laravel專案的根目錄使用composer 命令安裝

composer require laravel/scout

(2)接下來,你需要將 ScoutServiceProvider 新增到你的 config/app.php 配置檔案的 providers 陣列中:

Laravel\Scout\ScoutServiceProvider::class,

(3)註冊好 Scout 的服務提供者之後,你可以使用 vendor:publish Artisan 命令生成 Scout 的配置檔案。這個命令會在你的 config 目錄下生成 scout.php 配置檔案:

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

(4)使用 composer安裝scout的es驅動:

composer require tamayo/laravel-scout-elastic

(5)安裝完驅動之後,修改config\scout.php配合檔案,將驅動修改為elasticsearch

 'driver' => env('SCOUT_DRIVER', 'elasticsearch'),

並在下方新增驅動:

'elasticsearch' => [
        //laravel54是專案名,可以自定義
        'index' => env('ELASTICSEARCH_INDEX', 'laravel54'),
        'hosts' => [
            env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
        ],
    ],

建立command命令

(1)使用php artisan建立command命令

php artisan make:command ESInit

(2)執行完命令後會建立app\Console\Command\ESInit.php檔案,修改ESInit.php

//使用什麼命令啟動指令碼
protected $signature = 'es:init';
//描述
protected $description = 'init laravel es for post';

(3)在app\Console\Kernel.php中掛載

protected $commands = [
        \App\Console\Commands\ESInit::class
    ];

完成之後使用php artisan命令檢視命令是否掛載成功

安裝guzzlehttp/guzzle 擴充套件

composer require guzzlehttp/guzzle

配置

(1)修改app\Console\Command\ESInit.php

public function handle()
    {
        //建立template
        $client=new Client();

        $url=config('scout.elasticsearch.hosts')[0]. '/_template/tmp';
        //$client->delete($url);

        $param = [
            'json'=>[
                'template' => config('scout.elasticsearch.index'),
                'mappings' => [
                    '_default_' => [
                        'dynamic_templates' => [
                            [
                                'strings' => [
                                    'match_mapping_type' => 'string',
                                    'mapping' => [
                                        'type' => 'text',
                                        'analyzer' => 'ik_smart',
                                        'fields' => [
                                            'keyword' => [
                                                'type' => 'keyword'
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ],
            ],
        ];
        $client->put($url,$param);

        //記錄
        $this->info("=======建立模板成功=======");

        //建立index
        $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
        //$client->delete($url);
        $param=[
            'json' => [
                'settings' => [
                    'refresh_interval' => '5s',
                    'number_of_shards' => 1,
                    'number_of_replicas' => 0,
                ],
                'mappings' => [
                    '_default_' => [
                        '_all' => [
                            'enabled' => false
                        ]
                    ]
                ]
            ]
        ];

        $client->put($url,$param);

        //記錄
        $this->info("=========建立索引成功=========");
    }

(2)在我的專案中我使用文章資料表來搜尋,因此需要修改post.php,也就是posts資料對於的資料模型

use Searchable;

    //定義索引裡面的type
    public function searchableAs()
    {
        return "post";
    }

    //定義有哪些欄位需要搜尋
    public function toSearchableArray()
    {
        return [
            'title'=>$this->title,
            'content'=>$this->content,
        ];
    }

匯入資料

使用php artisan命令匯入資料

php artisan scout:import "\App\Post"

匯入成功之後我們在瀏覽器地址輸欄入:127.0.0.1:9200/laravel54/post/23(laravel54是elasticsearch驅動定義的專案名,post物件的是我專案的post資料模型,23是某條資料的ID )

相關文章