端くれプログラマの備忘録 Laravel [Laravel] ElasticSearchとLaravel Scoutで全文検索 (2) – Laravel Scoutセットアップ

[Laravel] ElasticSearchとLaravel Scoutで全文検索 (2) – Laravel Scoutセットアップ

ElasticSearchのセットアップができたので、ここからはLaravel側のセットアップ。

Laravel Scountの組み込み

Laravel Scout – Laravel – The PHP Framework For Web Artisans
https://laravel.com/docs/5.4/scout

Laravel Scout Elasticsearch Driver
https://github.com/ErickTamayo/laravel-scout-elastic

$ composer require laravel/scout
$ composer require tamayo/laravel-scout-elastic
$ composer require elasticsearch/elasticsearch

$ vi config/app.php
Laravel\Scout\ScoutServiceProvider::class,
ScoutEngines\Elasticsearch\ElasticsearchProvider::class,

$ php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
$ vi app/Article.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Article extends Model
{
  use Searchable;

  protected $fillable = ['title', 'description', 'tags', 'published_on'];
  protected $dates = ['published_on'];
}

 

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

'elasticsearch' => [
  'index' => env('ELASTICSEARCH_INDEX', 'laravel'),
  'config' => [
    'hosts' => [
     env('ELASTICSEARCH_HOST', 'localhost'),
    ],
  ],
],
$ vi .env
ELASTICSEARCH_INDEX=scout
ELASTICSEARCH_HOST=http://localhost:9200

これでセットアップは完了。

ElasticSearchへ既存データ注入

公式ドキュメントで説明されている通り、Laravel Scoutを組み込んだ状態だと、Eloquentでレコード追加/更新/削除を行うとElasticSearchも併せて更新されるようになる。しかし、ElasticSearch組み込み時点で既に存在するレコードは手動でElasticSearchに流し込まないといけない。

というわけで、既存レコードをElasticSearchに流し込む。

$ php artisan scout:import "App\Article"
Imported [App\Article] models up to ID: 12
All [App\Article] records have been imported.

ElasticSearchのインデックスを確認。

$ curl -X GET http://localhost:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open scout PN7wNd5iRga8pqmc9nj0VA 5 1 12 0 292.9kb 292.9kb

コントローラから検索してみる

$articles = Article::search($str)->get();

記事本文に含まれる日本語の単語を入れてみると、検索されるものあり、されないものあり。どうも挙動がおかしい。おそらく日本語の処理が上手くいっていないのだろう。

Kuromojiのセットアップへ続く。