Laravel 基于 Scout 配置实现 Elasticsearch

Posted 飞翔的贺兰猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 基于 Scout 配置实现 Elasticsearch相关的知识,希望对你有一定的参考价值。


一、安装scout
1、安装

composer require laravel/scout


2、接下来,你需要将 ScoutServiceProvider 添加到你的 config/app.php 配置文件的 providers 数组中:

Laravel\\Scout\\ScoutServiceProvider::class,


3、注册好 Scout 的服务提供者之后,你可以使用 vendor:publish Artisan 命令生成 Scout 的配置文件。这个命令会在你的 config 目录下生成 scout.php 配置文件:

php artisan vendor:publish --provider="Laravel\\Scout\\ScoutServiceProvider"

注意:执行上述命令没反应时 直接执行 php artisan vendor:publish 然后输入数字选择

4、使用 composer安装scout的es驱动:

composer require tamayo/laravel-scout-elastic


5、安装完驱动之后,修改config\\scout.php配合文件,将驱动修改为elasticsearch

\'driver\' => env(\'SCOUT_DRIVER\', \'elasticsearch\'),


6、并在下方添加驱动:

\'elasticsearch\' => [
//laravel_es_test是项目名,可以自定义
\'index\' => env(\'ELASTICSEARCH_INDEX\', \'laravel_es_test\'),
\'hosts\' => [
env(\'ELASTICSEARCH_HOST\', \'http://127.0.0.1:9200\'),
],
],


二、创建command命令
1、使用php artisan创建command命令

php artisan make:command ESInit


2、执行完命令后会创建app\\Console\\Command\\ESInit.php文件,修改ESInit.php

//使用什么命令启动脚本
protected $signature = \'es:init\';
//描述
protected $description = \'init laravel es for post\';


3、在app\\Console\\Kernel.php中挂载

protected $commands = [
\\App\\Console\\Commands\\ESInit::class
];

 

三、配置
1、安装guzzlehttp/guzzle 扩展

composer require guzzlehttp/guzzle


2、修改app\\Console\\Command\\ESInit.php

/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
try{
//创建template
$client = new \\GuzzleHttp\\Client(); //这里的Clinet()是你vendor下的GuzzleHttp下的Client文件
$this->createTemplate($client);
$this->info(\'============create template success============\');
$this->createIndex($client);
$this->info(\'============create index success============\');
}catch (\\Exception $e){
ownLogs(\'test.log\', $e->getMessage());
}

}

/**
* 创建模板 see https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html
* @param Client $client
*/
private function createTemplate($client)
{
$url = config(\'scout.elasticsearch.hosts\')[0] . \'/_template/template_1\';
// $client->delete($url);
$client->put($url, [


\'json\' => [
\'index_patterns\' => [config(\'scout.elasticsearch.index\').\'*\'],
\'settings\' => [
\'number_of_shards\' => 1,
],
\'mappings\' => [
\'_source\' => [
\'enabled\' => true
],
\'properties\' => [
\'mapping\' => [ // 字段的处理方式
\'type\' => \'keyword\', // 字段类型限定为 string
\'fields\' => [
\'raw\' => [
\'type\' => \'keyword\',
\'ignore_above\' => 256, // 字段是索引时忽略长度超过定义值的字段。
]
],
],
],


],
],
]);
}


/**
* 创建索引
* @param Client $client
*/
private function createIndex($client)
{
$url = config(\'scout.elasticsearch.hosts\')[0] . \'/\' . config(\'scout.elasticsearch.index\');
// $client->delete($url);
$client->put($url, [
\'json\' => [
\'settings\' => [
\'refresh_interval\' => \'5s\',
\'number_of_shards\' => 1, // 分片为
\'number_of_replicas\' => 0, // 副本数
],
],
]);
}

 

 

执行命令

php artisan es:init

 

 

 

注意:当前版本 ES7.3
6.0以下,6.*,7.*,很多语法差别
官方语法地址
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html

PUT _template/template_1
{
"index_patterns": ["te*", "bar*"],
"settings": {
"number_of_shards": 1
},
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z yyyy"
}
}
}
}


四、编辑Model文件,导入数据,调用接口
1、编辑Model文件

<?php

namespace App\\Models;

use Laravel\\Scout\\Searchable;

class User extends Authenticatable
{
use Searchable;

protected $table = \'users\';

/**
* The attributes that are mass assignable.
* 可以注入的数据字段
* @var array
*/
protected $fillable = [
\'name\', \'phone\',\'username\'
];

// 定义索引里面的类型
public function searchableAs()
{
return \'_doc\';
}
// 定义有那些字段需要搜索
public function toSearchableArray()
{
return [
\'username\' => $this->username,
\'phone\' => $this->phone,
];
}
}

 


2、导入数据

php artisan scout:import "App\\Models\\user"

 

 

 

注意:看起来是导入成功其实不一定,
vendor/tamayo/laravel-scout-elastic/src/ElasticsearchEngine.php文件中的update方法
$this->elastic->bulk($params);

这句代码会最终发送指令到es.但是这里没接收返回值,建议打印一下

 

 

一次成功,一次未成功

3、调用接口

$q = $request->input(\'q\');
$res = User::search($q)->get();
return Response::success(\'成功\', $res);

 


http://localtest/laravel_es_test/_doc/1
laravel_es_test:索引
_doc:类型
1:id

 

以上是关于Laravel 基于 Scout 配置实现 Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章

基于 centos7 搭建 laravel+scout+elasticsearch+ik-analyzer 用于中文分词全文检索服务及测试

带有弹性搜索的 Laravel Scout 不起作用

Laravel Scout (Meilisearch) - 说是导入的数据,但不是

Laravel scout elastic-scout-driver 返回空响应

Laravel/Scout - 如何获取文档总数?

安装scount的es驱动,composer require tamayo/laravel-scout-elastic报错解决