一: 安装Elasticsearch和ik(中文插件)
直接GitHub地址下载:https://github.com/medcl/elasticsearch-rtf 需要声明的是运行环境必须支持以下: 1:.JDK8+
2:系统可用内存>2G
运行 Mac/Linux:
cd elasticsearch/bin
./elasticsearch复制代码
sudo -u ops ES_JAVA_OPTS="-Xms2024m -Xmx2024m" ./bin/elasticsearch -d
Windows:
cd elasticsearch/bin
elasticsearch.bat复制代码
二: 安装Elasticsearch的Laravel 的搜索系统 Scout
1: 首先,使用 composer 包管理器来安装 Scout:
composer require laravel/scout
接下来,你需要将ScoutServiceProvider
添加到你的配置文件config/app.php
的providers
数组中:
Laravel\Scout\ScoutServiceProvider::class,
注册好 Scout 的服务提供器之后,你还需使用Artisan 命令 vendor:publish 生成 Scout 的配置文件。这个命令会在你的 config 目录下生成 scout.php 配置文件:
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
最后,将 Laravel\Scout\Searchable trait 加到你想要搜索的模型中。
2: 安装 Laravel Scout Elasticsearch Driver
composer require tamayo/laravel-scout-elastic
// config/app.php'providers' => [
...
Laravel\Scout\ScoutServiceProvider::class,
...
ScoutEngines\Elasticsearch\ElasticsearchProvider::class,
],复制代码
修改scout.php
// config/scout.php'driver' => env('SCOUT_DRIVER','elasticsearch'),
...'elasticsearch' => ['index' => env('ELASTICSEARCH_INDEX','laravel'),'hosts' => [
env('ELASTICSEARCH_HOST','http://localhost:9200'),
],
],
...复制代码
三: 创建Elasticsearch的模板和索引
1: 使用laravel的Command实现搜索引擎索引和模版的建立
创建 PHP Artisan 命令php artisan make:command ESInit
命令执行之后你会看到app/console/commands/ESInit.php
新创建的文件。 修改此文件的一些内容如下:
// 执行脚本命令的名称
// 执行 php artisan es:init
protected$signature ='es:init';
// 控制台命令的描述,可以是中文
protected$description ='执行ES搜索的命令';复制代码
修改具体执行的方法 handle之前: 需要引入use GuzzleHttp\Client;
如果没有此扩展包,可以先下载之后引入composer require guzzlehttp/guzzle
publicfunctionhandle()
{$client = new Client();
// 创建模版$url = config('scout.elasticsearch.hosts')[0] .'/_template/tmp';$client->put($url, ['json' => ['template' => config('scout.elasticsearch.index'),'settings' => ['number_of_shards' => 1
],'mappings' => ['_default_' => ['_all' => ['enabled' =>true
],'dynamic_templates' => [
['strings' => ['match_mapping_type' =>'string','mapping' => ['type' =>'text','analyzer' =>'ik_smart','ignore_above' => 256,'fields' => ['keyword' => ['type' =>'keyword'
]
]
]
]
]
]
]
]
]
]);
// 为了方便看到执行结果$this->info("======= 创建模板成功 =======");$url = config('scout.elasticsearch.hosts')[0] .'/' . config('scout.elasticsearch.index');$client->put($url, ['json' => ['settings' => ['refresh_interval' =>'5s','number_of_shards' => 1,'number_of_replicas' => 0,
],'mappings' => ['_default_' => ['_all' => ['enabled' =>false
]
]
]
]
]);
// 为了方便看到执行结果$this->info("======= 创建索引成功 =======");
}复制代码
然后在app\Console\Kernel.php
引入代码如下:
protected$commands = [
//
\App\Console\Commands\ESInit::class
];复制代码
然后执行命令测试php artisan es:init
如果你看到了
======= 创建模板成功 =======
======= 创建索引成功 =======复制代码
说明你命令已经创建成功,接下来在你想要使用搜索的模型中引入吧。
然后再你要使用的模型中引入并加入两个方法 如下:(我是在Status模型下加入的)
use Laravel\Scout\Searchable;
class Status extends Model
{
use Searchable;
....
// 定义索引里面的type
publicfunctionsearchableAs()
{return"status";
}
// 定义有哪些字段需要 搜索
publicfunctiontoSearchableArray()
{return ['content' =>$this->content
];
}
...
}复制代码
四: 新增数据和导入已有数据
以上都完成之后,就可以导入数据库中的进行搜索了。 执行命令php artisan scout:import 模型名
比如php artisan scout:import "App\Status"
能明显看到你数据表中最大的ID是多少,当你看到类似如下的提示说明你已经导入成功了。
Imported [\App\Status] models up to ID: 52
All [\App\Status] records have been imported.复制代码
接下来你就可以通过URl访问来测试查看你要搜索的数据了。 url:http://127.0.0.1:9200/laravel/status/4
laravel 代表你自己创建的索引的名字,就是如下 :ELASTICSEARCH_INDEX
的名字
'elasticsearch' => ['index' => env('ELASTICSEARCH_INDEX','laravel'),'hosts' => [
env('ELASTICSEARCH_HOST','http://localhost:9200'),
],
],复制代码
五: 搜索逻辑和数据展示
接下要做的就相对简单了,新建一个路由如下: Route::get('status/search','StatusesController@search'); 新建一个对应的方法如下: // 搜索页面
publicfunctionsearch()
{
// 验证提交的数据$this->validate(request(),['query' =>'required'
]);$query = request('query');
// 查询$posts = Status::search(request('query'))->paginate(10);
// 渲染return view('static_pages/search', compact('posts','query'));
}复制代码
前端页面这里就不写了。就是基本的数据 foreach 渲染了。