[Laravel] インデックスするデータを絞り込む (Laravel Scout)

デフォルトだとSearchableなModelの全カラムがインデックスされる。

インデックスしたくないカラムがある場合はSearchableのtoSearchableArray()を上書きして、リターンされる配列からそのカラムのデータを除外すれば良いらしい。

参考サイト

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

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

Kuromojiは日本語の形態素解析ライブラリ。これ無しだと、日本語が分かち書きされない状態でインデックス化されてしまうので、日本語の単語で全文しようとしてもうまくヒットしないのだろうと想像する。

Kuromojiに関しては以下の説明が明るい。

Elasticsearchを日本語で使う設定のまとめ – Qiita
http://qiita.com/shin_hayata/items/41c07923dbf58f13eec4

Kuromojiのインストール

kuromoji – japanese morphological analyzer
http://www.atilika.org/

Japanese (kuromoji) Analysis Plugin | Elasticsearch Plugins and Integrations [5.5] | Elastic
https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji.html

ElasticSearch同梱のユーティリティを使ってインストールする。

Kuromojを設定する

公式サイトを眺めてみたんだけど、はっきりと「設定はコレ」みたいな記事がない。

以下の記事がちょっと古いんだけど設定ファイルの記述があったのでなぞってみる。

Elasticsearch に kuromoji を入れて日本語全文検索をする – Qiita
http://qiita.com/mserizawa/items/8335d39cacb87f12b678

設定ファイル編集してElasticSeachを再起動したらログにエラーが出た。

API経由でインデックスごとに設定しろということらしい。

インデックスの変更前にはインデックスを一旦クローズする必要がある。そして設定を変更してから、インデックスを再度オープンすることで、新しい設定でインデックスが使えるようになる。これ少しハマったので以下記事を覚書リンク。

elasticsearch – error when trying to update the settings – Stack Overflow
https://stackoverflow.com/questions/19758335/error-when-trying-to-update-the-settings

これで設定が変わったので、古い設定のまま作成されているインデックスをいったん削除する。

再び記事をElasticSearchに流し込む。

インデックスのサイズを比べてみる。Kuromoji追加前のインデックスは記事12件で183KB。

Kuromoji追加後のインデックスは記事12件で292.9KB。

形態素解析により日本語が分かち書きされてインデックスされた結果だろう。

日本語の単語で検索したら今度はちゃんとヒットした。良さげ。

[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

 

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

ElasticSearchへ既存データ注入

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

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

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

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

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

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

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

Laravel Scoultは、Laravelにフルテキスト検索機能を追加するパッケージ。

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

その検索エンジンにはデフォルトでAlgoliaが選ばれている。

Algolia | The Most Reliable Platform for Building Search
https://www.algolia.com/

AlgoliaはサーチAPIを提供する商用サービス。無償プランもあるけど、レコード上限は1万件、オペレーション上限は月間10万件に制限されている。自分が今やっている実験ではレコード件数がすでに6万件を超えているので無償プランは使えない。かといって、自腹で有償プランを契約できる予算は無い。

Laravel Scoutはドライバを書くことで異なる検索エンジンを接続できるようになっている。オープンソースのフルテキスト検索エンジンと言えばElasticSearch。調べてみると、Laravel ScoultのElastric Searchドライバがすでに存在した。

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

セットアップ手順を説明している記事も見つかった。

Basic Search Functionality with ElasticSearch & Laravel Scout
https://medium.com/@samogorm/basic-search-functionality-with-elasticsearch-laravel-scout-6ac182c99cbf

この記事をなぞって、自分のLaravelプロジェクトにElasticSearch+Laravel Scoutによる全文検索機能を追加してみたい。いきなり本番サーバーに適用するのは怖いので、ローカルのHomestead(Ubuntu)で試してみる。

まずは以下の下準備を行う。

Prerequisites

  • Basic Knowledge of Laravel
  • You have Laravel 5.3 installed
  • The latest Java version is installed to your machine
  • You have installed ElasticSearch to your machine
  • You have ElasticSearch running a http://localhost:9200

Javaのインストール

Linuxmania:apt-getでJavaをインストールしよう (Ubuntu)
https://www.linuxmania.jp/apt-install-java.html

ElasticSearchのインストール

Installing Elasticsearch | Elasticsearch Reference [5.5] | Elastic
https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html

ElasticSearchが動いたので、Laravel Scoutの組み込みに続く。

[PHP] PhantomJSを使ってJavaScriptでレンダリングされるページをスクレイピングする

サーバーサイドでクローンを使っていくつかのサイトを定期的にスクレイピングしているのだけど、新たに追加するサイトがAngularJSで書かれているようで、file_get_contents関数などではHTMLを取得できないことがわかった。さてどうするか。

ヘッドレスブラウザのPhantomJSを使えば、JavaScriptでレンダリングされた結果のHTMLをサーバーサイドでも取得できそうだ。PHP PhantomJSというPHPのインタフェースも公開されているようなので、LaravelのCommandとして実装してみる。

PhantomJSのセットアップ

PhantomJS | PhantomJS
http://phantomjs.org/

Linux 64-bitをダウンロードして bin ディレクトリに格納。


動作確認

PHP PhantomJS

GitHub – jonnnnyw/php-phantomjs: Execute PhantomJS commands through PHP

コーディング

以下のサイトのサンプルを拝借してテスト。

PHP PhantomJS を使ってPHPでヘッドレスブラウジング | QUARTETCOM TECH BLOG
http://tech.quartetcom.co.jp/2016/04/07/php-phantomjs/


動いた。

[Webサイト制作] Test My Site – モバイルサイトの速度をテストしましょう

Googleの新しい診断ツール。

モバイルサイトの読み込み速度とパフォーマンスをテストする – Google
https://testmysite.withgoogle.com/intl/ja-jp

参考サイト

新たなスピード診断ツール、Test my siteをGoogleが公開。遅さが原因の想定ユーザー離脱率は何%? | 海外SEO情報ブログ
https://www.suzukikenichi.com/blog/measuring-site-speed-by-test-my-site/

[Laravel] ファイルをダウンロードさせるには

サーバー上のファイルをダウンロードさせるには

Response::download()を使う。

データをファイルとしてダウンロードさせるには

Response::make()を使う。

参考サイト

Laravelでファイルを生成せずにファイルダウンロード – ふたりはララベル (Laravel PHP Framework)
http://laravel.hatenablog.com/entry/2015/03/19/232748

Laravelでファイルダウンロード1 – ふたりはララベル (Laravel PHP Framework)
http://laravel.hatenablog.com/entry/2015/03/18/234506

HTTP Responses – Laravel – The PHP Framework For Web Artisans
https://laravel.com/docs/master/responses

[Laravel] Eloquentでカウントするときの注意

ハマったので覚書。

以下の書き方だと該当レコードを全てgetしてしまうのでメモリ消費が大きい。

以下の書き方だとSQLクエリーでcount(*)を取得するだけなので軽い。

参考サイト

Eloquentでカウントするときの注意 – ララジャパン
http://www.larajapan.com/2016/06/19/eloquent%E3%81%A7%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F/