質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

3274閲覧

ElasticSearchのリクエストパラメータによるアクセスがうまくいかない

zushi0905

総合スコア683

Elasticsearch

Elasticsearchは、クラウド向けに構築された、RESTful な API を提供する分散型のサーチエンジンアプリケーションです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/06/17 07:39

編集2019/06/17 08:59

お世話になっております。今回はlaravelプロジェクトに置いてElasticsearchを導入しようとしています。
ElasticSearchに関しては完全に初心者です。

下の記事を参考にLaravel上で動くか実験中です。

【Laravel】Laravel Scout + Elasticsearchを使った全文検索の実装方法

環境

  • Laradock
  • PHP 7.2
  • laravel 5.7.2
  • ElasticSearch 6.6
  • mysql 5.5

立ち上げているドッカーコンテナ

  • nginx
  • php-fpm
  • elasticsearch
  • mysql

状況

上記の記事と異なる点として、Dockerのworkspaceからlaravelを扱っている所がありエラー部分がいくつか出ましたが、Host名を調整することで動いています。
また、ElasticSearchEngineの部分でflushメソッドがないというエラーが出た為、下の空メソッドを追加して動かしています。

php

1 public function flush($models){}

データも正常に入り、記事の'登録済みのデータを取得する'のところで下のコマンドを実行すると記事と同様にデータが出力される状態です。

登録済みのデータを取得する

cmd

1// 全取得 2$ curl -H "Content-Type:application/json" -X GET elasticsearch:9200/scout/_search -d '{"query":{"match_all":{}}}' 3 4// 検索 5$ curl -H "Content-Type:application/json" -X GET "elasticsearch:9200/scout/_search" -d {\"query\":{\"match\":{\"id\":3}}} 6

問題

記事の'リクエストパラメータを使って検索してみる'を行おうとしたところデータが一つもブラウザ上に表示されず困っています。

リクエストパラメータを使って検索してみる

php

1Route::get('/post/search', function () { 2 return App\Models\Post::search(\request('q'))->paginate(); 3});

http://localhost/post/search?q=1などクエリを入れてアクセスしても以下のようにdataが入らない状態です。

json

1# 整形してあります 2{ 3 "current_page": 1, 4 "data": [], 5 "first_page_url": "http://localhost/post/search?query=&page=1", 6 "from": null, 7 "last_page": 1, 8 "last_page_url": "http://localhost/post/search?query=&page=1", 9 "next_page_url": null, 10 "path": "http://localhost/post/search", 11 "per_page": 15, 12 "prev_page_url": null, 13 "to": null, 14 "total": 0 15}

curlでは正常に検索も行えていますが、laravelを使って表示が上手くいきません。どこが問題かも検討が付かず困っています。ご教授よろしくお願い致します。

追記

** ElasticSearcEngin **

/** * Perform the given search on the engine. * * @param \Laravel\Scout\Builder $builder * @return mixed */ public function search(Builder $builder) { return $this->performSearch($builder, array_filter([ 'filters' => $this->filters($builder), 'limit' => $builder->limit, ])); } /** * @param \Laravel\Scout\Builder $builder * @param array $options * @return array|mixed */ protected function performSearch(Builder $builder, $options = []) { $params = [ 'index' => $this->index, 'type' => $builder->index ?: $builder->model->searchableAs(), 'body' => [ 'query' => [ 'bool' => [ 'must' => [ 'term' => [ 'title' => "{$builder->query}", ] ], ], ], ] ]; if ($sort = $this->sort($builder)) { $params['body']['sort'] = $sort; } if (isset($options['filters']) && count($options['filters'])) { $params['body']['query']['bool']['filter'] = $options['filters']; } if ($builder->callback) { return call_user_func( $builder->callback, $this->elastic, $builder->query, $params ); } return $this->elastic->search($params); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/17 09:58

まずは記事とすべてバージョンを合わせて試してください。
guest

回答3

0

performSearch部分のクエリを

$params = [ 'index' => $this->index, 'type' => $builder->index ?: $builder->model->searchableAs(), 'body' => [ 'query' => [ 'bool' => [ 'must' => [ [ 'query_string' => [ 'query' => "{$builder->query}" ] ] ] ] ] ] ];

こんな感じにするとtitle以外も検索対象になるはずです

投稿2019/06/17 10:13

sola-msr

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zushi0905

2019/06/17 10:17

理想通りの動きになりました!本当に助かりました。ありがとうございます!
guest

0

自分も同じ記事を参考に少し触った程度なのであっているかわかりませんが・・・

①カスタムエンジンのperformSearch部分のクエリが正しいか
②DB自体にデータが入っているのか(記事はsqliteでしたが自分はMysqlにデータをいれてました)

を確認されたらいいのかなと

投稿2019/06/17 08:50

sola-msr

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zushi0905

2019/06/17 09:06

回答ありがとうございます! DBのデータは正常に入っています。カスタムエンジンのクエリが正しいかとの事ですが、記事のものをそのままコピペさせて頂いています。このままだと動かないのでしょうか? 質問にソースを追加致しました。ざっとコードを読んで見ましたが、どのように動いているかチンプンカンプンです。どの部分を直せば良いかご教授願いたいです。
sola-msr

2019/06/17 09:21

自分もわかってわかってないので的確な回答ができませんがご了承を カスタムエンジンは参考記事のままならおそらく大丈夫です (日本語での検索挙動がおかしいので、ちゃんと対応するとなるとKuromoji(日本語形態素解析エンジン)なるものをさらに導入する必要があるみたいです) DBはtinker等などでデータを登録&確認できるじょうたいですか? なんとなくelasticsearchに登録したデータしか確認できてないのかなと思ったので・・・
zushi0905

2019/06/17 09:40

一人で悩んでも1日経つだけだったので有り難いです! 日本語でならKuromojiが必要になるのですね! 今回はfakerを使ってサンプルデータを作っているので英語しか使っていないのでKuromojiが直接関わってくる感じではないですよね.... tinkerから登録も確認もできる状態になっています。ブラウザからアクセスする時のqに何を入れてもデータが帰ってこないという所が謎なんですよね。
zushi0905

2019/06/17 10:07

お世話になっております。動かなかった理由が判明しました! しょうもない事で申し訳ないのですが、検索の時大文字を使えないっぽいです。ずっと大文字入りの単語で検索していました。また、全てのカラムで検索が適応されるものだと思っており、数字などでも検索していました。 solaさんに指摘頂いたpeformSearchの中身をみてtitleカラムにしか適応されていないことを理解し、検索に再チャレンジして見た所、全て小文字の単語の検索の時引っかかりました! お手数をお掛けして申し訳ありませんでした。ありがとうございます。
sola-msr

2019/06/17 10:11

あーなるほどです そこのクエリをいじるとtitle以外も検索対象になるはずです 自分は ``` $params = [ 'index' => $this->index, 'type' => $builder->index ?: $builder->model->searchableAs(), 'body' => [ 'query' => [ 'bool' => [ 'must' => [ [ 'query_string' => [ 'query' => "{$builder->query}" ] ] ] ] ] ] ]; ``` こんな感じに実装しました
guest

0

自己解決

検索の時に大文字入りの検索ワードは引っかからないようです。

'Alias in DDD'のような文があったとき、クエリーとして引っかかるものは'alias','in','ddd'のようです。

modelのsearchへ飛ばす前に小文字に変換する処理を書くことで大文字入りでも検索できるようにしました。

php

1Route::get('/post/search', function () { 2 3 $query = mb_strtolower(\request('q')); 4 5 return App\Models\Post::search($query)->paginate(); 6});

いまだに数字の検索はうまくいっておりません。ここからはESの分野だと思うのでもう少し探ってみようと思います。

投稿2019/06/17 10:12

zushi0905

総合スコア683

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問