首頁 > php教程 > PHP开发 > Laravel5.3+Scout+ElasticSearch5.0

Laravel5.3+Scout+ElasticSearch5.0

高洛峰
發布: 2016-11-15 14:44:23
原創
1366 人瀏覽過

系統環境

Ubuntu16.04, ElasticSearch5.0, JDK1.8

ElasticSearch5.0

安裝es5.0沒什麼要點,只要跟著官方文檔成功運行環境,別人還是在用es2.4,一是項目大了,二是jdk的不同版本對內存的要求不一樣.
而且在es5.0之後, 由於取消了site-plugin, 導致很多插件都不能按照以前的方式安裝了. 比如很常用elasticSearch-head, 現在就要通過Grunt運行. 或者其他插件放進Nginx或者Apache的www目錄運行.

安裝後可能出現的小問題:

$JAVA_HOME找不到, 但是的確有安裝, 可以設定/etc/default/elasticsearch 這個文件裡面找到 JAVA_HOME=/usr/local/java/jdk1.8.0_101/jre;

要是環境內存太小就不要安裝, es5.0差不多佔了我2.5G的內存, 當然現在一般人的電腦內存都挺多的;

安裝並配置Laravel/Scout

在.env文件底部添加這三行

SCOUT_DRIVER=customElasticSearch
ELASTICSEARCH_INDEX=box
ELASTICSEARCH_HOST=localhost:9200
登入後複製

這三行配置是Scout用於確定你文件底部添加這三行

$query = [
            'index' =>  $this->index,
            'type'  =>  $builder->model->searchableAs(),
            'body' => [
                'query' => [
                    'filtered' => [
                        'filter' => $filters,
                        'query' => [
                            'bool' => [
                                'must' => $matches
                            ]
                        ],
                    ],
                ],
            ],
        ];
登入後複製

這三行配置是Scout用於確定你使用什麼Engine, 並且和搜尋引擎的地址.


讀者可能會發現我的Driver是customElasticSearch, 而不是elasticsearch.

因為當你打開ElasticSearchEngine, 找到performSearch Method,在裡面你會發現有這麼一段程式碼

这只是演示, 要真使用以后一定要改
$matches[] = [
            'match' => [
                '字段名' => $builder->query
            ]
        ];
登入後複製

如果你直接運行search Method, 就會告訴你 filtered已經取消了,詳見官網這個地址.

但是你又不能去直接改package的代碼, 還好Scout提供了自定義Engine.

所以我們新建一個customElasticSearchEngine , 繼承elasticSearchEngine, 重寫performSearch Method. 在其中,我修改了兩處地方,

$query = [
            'index' => $this->index,
            'type' => $builder->model->searchableAs(),
            'body' => [
                'query' => [
                    'bool' => [
                        'filter' => $filters,
                        'must' => $matches,
                    ],
                ],
            ],
        ];
登入後複製
rrreee

使用Scout可能的小坑

如果你在數據庫的表有主鍵自增且名為id的字段, 但是你不希望 elasticSearch使用資料表的id來充當es的Document的id, 那麼你需要更改model的 $primaryKey並且public $incrementing = false;, 這樣你就能指定當前數據表的其他值充當es的id. 如果es的資料有一部分_id是資料庫的id, 而另一部分又是你新指定的, 那麼會導致你的搜尋也好,其他操作也好都受影響.


🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板