参考文档:
运行环境:
php7
laravel框架 5.5
调用:
//执行命令,加载laravel-elastic驱动
# composer require babenkoivan/scout-elasticsearch-driver
//修改laravel配置文件(如果 框架版本小于5.4)
//在config/app.php最后增加
'providers' => [
Laravel\Scout\ScoutServiceProvider::class,
ScoutElastic\ScoutElasticServiceProvider::class,
]
//执行命令,发布(命令生成elastic配置文件)
# php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
# php artisan vendor:publish --provider="ScoutElastic\ScoutElasticServiceProvider"
//修改elastic配置文件 config/sout.php
//(两处地方需要改)
'driver' => env('SCOUT_DRIVER', 'elastic'),
'elastic' => [
'index' => env('ELASTICSEARCH_INDEX', 'my_elastic'),
'hosts' => [
env('ELASTICSEARCH_HOST', 'http://(服务器elastic的ip):9200'),
],
],
//修改 config/scout_elastic.php
return [
'client' => [
'hosts' => [
env('SCOUT_ELASTIC_HOST', '/(服务器elastic的ip):9200')
]
],
'update_mapping' => env('SCOUT_ELASTIC_UPDATE_MAPPING', true),
'indexer' => env('SCOUT_ELASTIC_INDEXER', 'single'),
'document_refresh' => env('SCOUT_ELASTIC_DOCUMENT_REFRESH')
];
//修改环境配置文件 根目录下的 .env 文件,增加
SCOUT_DRIVER=elastic
SCOUT_ELASTIC_HOST=服务器elastic的ip:9200
ELASTICSEARCH_HOST=http://服务器elastic的ip:9200
ELASTICSEARCH_INDEX=my_elastic
!!!/* 注意了 上面配置的 my_elastic 相当于数据库的名字 */!!!
//索引就是数据库名嘛
//生成索引文件 MyElasticIndexConfigurator 为 数据库名字IndexConfigurator
php artisan make:index-configurator MyElasticIndexConfigurator
//其中找到 文件 MyElasticIndexConfigurator
protected $name = 'my_index'; //数据库名字
protected $settings = [
'refresh_interval' => '5s',
'number_of_shards' => 1,
'number_of_replicas' => 0,
];
protected $defaultMapping = [
];
//新增 搜索的规则文件夹 App\Search\Rules
//新增 搜索的数据表文件夹 App\Search\Models
//向服务器请求,新增索引(新增数据库意思)
//其中MyElasticIndexConfigurator 为 刚刚上面创建的索引文件,注意命名空间App
php artisan elastic:create-index App\\MyElasticIndexConfigurator
//生成一个elasticsearch专用的 Model,如 用户表文件
//注意--index选项 意思是,把UserModel这个表 放到 索引 --index指定的文件,即 数据表存放到数据库下
//执行以下命令
php artisan make:searchable-model Search\\Models\\UserModel --index-configurator=MyIndexConfigurator
//打开上面创建的 UserModel
//看下指定的索引(数据库)是否正确
protected $indexConfigurator = \App\LogisticsArticleIndexConfigurator::class;
//指定数据库的表名
protected $table = 'users';
//UserModel完整如下
//其中规则文件生成 下一步添加
namespace App\Search\Models;
use App\Search\Rules\UserRule;
use ScoutElastic\Searchable;
use Illuminate\Database\Eloquent\Model;
class UserModel extends Model
{
use Searchable;
//表名
protected $table = 'users';
protected $indexConfigurator = \App\MyElasticIndexConfigurator::class;
/**
* 索引类型 类似 mysql的表
* @return string
*/
public function searchableAs()
{
return 'users';
}
//搜索规则,指定规则文件
protected $searchRules = [
UserRule::class
];
protected $mapping = [
'_source' => [
'enabled' => true
],
'properties' => [ //⽂文档类型设置(相当于mysql的数据类型)
'id' => [
'type' => 'integer', // //类型 string、integer、float、double、boolean、date,text,keyword
//'index'=> 'not_analyzed',//索引是否精确值 analyzed not_analyzed
],
'content' => [
'type' => 'text', // 字段类型为全⽂文检索,如果需要关键字,则修改为keyword,注意keyword字段为整体查询,不不能作为模糊搜索
"analyzer" => "ik_max_word",
"search_analyzer" => "ik_max_word",
]
]
];
//当查询的时候,默认返回的内容
public function toSearchableArray()
{
return [
'id'=>$this->id,
'content'=>$this->content
];
//return array_only($this->toArray(), ['id', 'name', 'email']);
}
}
//执行命令 搜索规则文件添加
# php artisan make:search-rule App\\Search\\Rules\\UserRule
//打开创建的规则文件,内容如下
//规则怎么配置,看看参考文档的 laravel-elastic有说明
public function buildHighlightPayload()
{
return [
'fields' => [
// 'title' => [
// 'type' => 'plain'
// ],
'content' => [
'type' => 'plain'
]
]
];
}
/**
* @inheritdoc
*/
public function buildQueryPayload()
{
return [
'must' => [
'match' => [
// 'title' => $this->builder->query,
'content' => $this->builder->query
]
]
];
}
//下一步,把userModel对应的数据表数据 映射(插入到)elastic服务器上
//执行命令
//userModel更改了,则需要更新下
# php artisan elastic:update-mapping App\\Search\\Models\\UserModel
//把数据库的数据 插入映射到 elastic服务器上
# php artisan scout:import "App\Search\Models\UserModel"
//说明:如果 UserModel的 properties 既字段的属性类型更改了,那么 执行上面的两个命令将会失败
//因此需要 先执行删除索引,创建索引 这两个命令,重复上面的步骤。
//最后控制器 调用elasticearch的model进行查询
\App\Search\Models\UserModel::search('查询的字眼')->get();