laravel-elasticsearch 配置以及运用

尉迟轶
2023-12-01

参考文档:

  搭建elasticsearch服务器

  laravel-elastic

  elasticsearch官方文档

 

运行环境:

  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();

 

 

 

 类似资料: