Laravel5.3+Scout+ElasticSearch5.0 小記

系統環境

Ubuntu16.04, ElasticSearch5.0, JDK1.8

ElasticSearch5.0

安裝es5.0沒什麼要點,只要跟着官方文檔流程通常都能安裝成功,併成功運行.
不過在線上環境,別人仍是在用es2.4,一是項目大了,二是jdk的不一樣版本對內存的要求不同.
並且在es5.0以後, 因爲取消了site-plugin, 致使不少插件都不能按照之前的方式安裝了. 好比很經常使用elasticSearch-head, 如今就要經過Grunt運行. 或者其餘插件放進Nginx或者Apachewww目錄運行.html

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

  • $JAVA_HOME找不到, 可是的確有安裝, 能夠設置/etc/default/elasticsearch 這個文件裏面找到 JAVA_HOME=/usr/local/java/jdk1.8.0_101/jre;數據庫

  • 要是環境內存過小就不要安裝, es5.0差很少佔了我2.5G的內存, 固然如今通常人的電腦內存都挺多的;elasticsearch

安裝並配置Laravel/Scout

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

SCOUT_DRIVER=customElasticSearch
ELASTICSEARCH_INDEX=box
ELASTICSEARCH_HOST=localhost:9200

這三行配置是Scout用於肯定你使用什麼Engine, 而且和搜索引擎的地址.ui

讀者可能會發現個人Driver是customElasticSearch, 而不是elasticsearch.
由於當你打開ElasticSearchEngine, 找到 performSearch Method,在裏面你會發現有這麼一段代碼this

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

若是你直接運行 search Method, 就會告訴你 filtered已經取消了,詳見官網這個地址.
可是你又不能去直接改package的代碼, 還好Scout提供了自定義Engine.搜索引擎

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

這只是演示, 要真使用之後必定要改
$matches[] = [
            'match' => [
                '字段名' => $builder->query
            ]
        ];
$query = [
            'index' => $this->index,
            'type' => $builder->model->searchableAs(),
            'body' => [
                'query' => [
                    'bool' => [
                        'filter' => $filters,
                        'must' => $matches,
                    ],
                ],
            ],
        ];

使用Scout可能的小坑

  1. 若是你在數據庫的表有主鍵自增且名爲id的字段, 可是你不但願 elasticSearch使用數據表的id來充當es的Document的id, 那麼你須要更改model$primaryKey而且public $incrementing = false;, 這樣你就能指定當前數據表的其餘值充當es的id. 若是es的數據有一部分_id是數據庫的id, 而另外一部分又是你新指定的, 那麼會致使你的搜索也好,其餘操做也好都受影響.插件

相關文章
相關標籤/搜索