你是否在检索千百万级数据时为性能和速度而担心呢,即便优化了sql,建立了数据库索引,仍是不尽如人意呢?
下面就主要介绍laravel如何集成Algoliaphp
Algolia是法国初创公司为你提供毫秒级的数据库实时搜索服务,天下武功无坚不摧,惟快不破。记住哦,是毫秒级。html
本文基于laravel5.5,其余版本大同小异。laravel
composer require laravel/scout composer require algolia/algoliasearch-client-php
前往https://www.algolia.com/ 注册帐号,初学者可使用免费版,而后在帐户的API Keys菜单获取Application ID和Admin API Key,后面会用到sql
在config/app.php文件中的providers数组中加入服务提供者数据库
// Scout全文搜索 Laravel\Scout\ScoutServiceProvider::class,
使用如下命令生成scout配置文件api
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
该命令会自动生成config/scout.php文件,而后咱们打开.env文件,加入scout的配置数组
# scout配置 SCOUT_DRIVER=algolia SCOUT_PREFIX= # algolia的Application ID ALGOLIA_APP_ID=xxxxxxxxxx # algolia的Admin API Key ALGOLIA_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxx
建立模型app/Student.php,为方便后续测试,请先建表和填充数据,能够手动使用sql语句添加数据,也使用laravel自动的数据迁移和填充,能够参考 https://www.tech1024.cn/origi...网络
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Laravel\Scout\Searchable; /** * 学生模型 */ class Student extends Model { use Searchable; /** * 索引名称 * * @return string */ public function searchableAs() { return 'students_index'; } /** * 可搜索的数据索引 * * @return array */ public function toSearchableArray() { $array = $this->toArray(); // Customize array... return $array; } }
php artisan scout:import "App\Student"
可能会报以下错误app
[AlgoliaSearch\AlgoliaConnectionException] Hosts unreachable: Resolving timed out after 1000 milliseconds,Resolving timed out after 1000 milliseconds,Resolving timed out after 3000 milliseconds,Resolving tim ed out after 3000 milliseconds
这是因为默认algoliasearch-client配置的链接超时时间为1秒,因为网络速度的缘由,咱们能够把链接时间修改一下
建立app/Services/Scout/EngineManager.php文件以下composer
<?php namespace App\Services\Scout; use AlgoliaSearch\Client as Algolia; use AlgoliaSearch\Version as AlgoliaUserAgent; use Laravel\Scout\EngineManager as BaseEngineManager; use Laravel\Scout\Engines\AlgoliaEngine; /** * */ class EngineManager extends BaseEngineManager { public function createAlgoliaDriver() { AlgoliaUserAgent::addSuffixUserAgentSegment('Laravel Scout', '3.0.7'); $algolia = new Algolia( config('scout.algolia.id'), config('scout.algolia.secret') ); // 设置链接超时时间 $algolia->setConnectTimeout(30, 30, 30); return new AlgoliaEngine($algolia); } }
打开app/Providers/AppServiceProvider.php,在boot()中加入如下代码
public function boot() { // …… 省略以前代码 $this->app->singleton(\Laravel\Scout\EngineManager::class, function ($app) { return new \App\Services\Scout\EngineManager($app); }); }
是否是导入成功了呢?
php artisan scout:import "App\Student" Imported [App\Student] models up to ID: 500 Imported [App\Student] models up to ID: 1000 Imported [App\Student] models up to ID: 1500 Imported [App\Student] models up to ID: 2000 Imported [App\Student] models up to ID: 2500 Imported [App\Student] models up to ID: 3000 Imported [App\Student] models up to ID: 3500 Imported [App\Student] models up to ID: 4000 Imported [App\Student] models up to ID: 4500 Imported [App\Student] models up to ID: 5000 Imported [App\Student] models up to ID: 5500 Imported [App\Student] models up to ID: 6000 Imported [App\Student] models up to ID: 6500 Imported [App\Student] models up to ID: 7000 Imported [App\Student] models up to ID: 7500 Imported [App\Student] models up to ID: 8000 Imported [App\Student] models up to ID: 8500 Imported [App\Student] models up to ID: 9000 Imported [App\Student] models up to ID: 9500 Imported [App\Student] models up to ID: 10000 All [App\Student] records have been imported.
在https://www.algolia.com帐户后... 的菜单中已经有了刚刚导入的students_index索引数据
$studens = App\Student::search('成燕')->get(); dd($studens);
能够填充个百万条数据试试,检索速度,是否是比直接查询数据库要快不少呢?
更多用法请查阅官方文档 https://www.algolia.com/doc/a...
不过笔者并不推荐使用algolia检索引擎,毕竟国内的网速太慢,后续笔者会退出laravel和elasticsearch、sphinx相关的资料,请继续关注。