教你在laravel中如何使用elaticsearch(步骤分明)

2022-05-15 0 752

下面由Laravel教程栏目带大家介绍在laravel中如何使用elaticsearch(步骤分明),希望对大家有所帮助!

安装相关扩展包

guzzlehttp/guzzleelasticsearch/elasticsearchlaravel/scoutbabenkoivan/scout-elasticsearch-driverpredis/predis 数据量大需要使用队列同步、拉取数据时安装


1.安装 guzzlehttp/guzzle

composer require guzzlehttp/guzzle

在 app/Services 目录下编写 Http 服务类

<?phpnamespace App\\Services;use GuzzleHttp\\Client;use GuzzleHttp\\Cookie\\CookieJar;class HttpService{    protected $client;    public function __construct()    {        $this->client = new Client(['verify' => false, 'timeout' => 0,]);    }    /**     * 发送 get 请求     * @param $url     * @param array $aQueryParam     * @param string $isDecode     * [@return](https://learnku.com/users/31554) mixed     * @throws \\GuzzleHttp\\Exception\\GuzzleException     */    public function get($url, $aQueryParam = [], $isDecode = true)    {        $response = $this->client->request('GET',            $url,            [                'query' => $aQueryParam            ]);        if($isDecode){            return \\GuzzleHttp\\json_decode($response->getbody()->getContents(), true);        }        return $response->getbody()->getContents();    }    /**     *  发送 post 请求     * @param $url     * @param array $aParam     * @param string $type     * @param string $isDecode     * [@return](https://learnku.com/users/31554) mixed     * @throws \\GuzzleHttp\\Exception\\GuzzleException     */    public function post($url, $aParam = [], $type = 'form_params', $isDecode = true)    {        $aOptions = [];        // Sending application/x-www-form-urlencoded POST        if ($type == 'form_params') {            $aOptions['form_params'] = $aParam;        }        //  upload JSON data        if ($type == 'json') {            $aOptions['json'] = $aParam;        }        $response = $this->client->request('POST', $url, $aOptions);        if($isDecode){            return \\GuzzleHttp\\json_decode($response->getbody()->getContents(), true);        }        return $response->getbody()->getContents();    }    /**     *  发送 put 请求     * @param $url     * @param array $aParam     * @param string $type     * @param string $isDecode     * [@return](https://learnku.com/users/31554) mixed     * @throws \\GuzzleHttp\\Exception\\GuzzleException     */    public function put($url, $aParam = [], $type = 'form_params', $isDecode = true)    {        $aOptions = [];        // Sending application/x-www-form-urlencoded POST        if ($type == 'form_params') {            $aOptions['form_params'] = $aParam;        }        //  upload JSON data        if ($type == 'json') {            $aOptions['json'] = $aParam;        }        $response = $this->client->request('PUT', $url, $aOptions);        if($isDecode){            return \\GuzzleHttp\\json_decode($response->getbody()->getContents(), true);        }        return $response->getbody()->getContents();    }    /**     * 保存远程文件到本地     * 跟随第三方服务器url重定向     * @param $url     * [@return](https://learnku.com/users/31554) bool|string     */    public function getRemoteFile($url)    {        $jar = new CookieJar();        $aOptions = ['cookies' => $jar];        $response = $this->client->request('GET', $url, $aOptions);        return $response->getBody()->getContents();    }}

2.安装 elasticsearch/elasticsearch

composer require elasticsearch/elasticsearch

3.安装 laravel/scout

composer require laravel/scoutphp artisan vendor:publish --provider="Laravel\\Scout\\ScoutServiceProvider"

4.安装 scout 第三方驱动 babenkoivan/scout-elasticsearch-driver

composer require babenkoivan/scout-elasticsearch-driverphp artisan vendor:publish --provider="ScoutElastic\\ScoutElasticServiceProvider"

scout 服务配置,在 env 中增加配置项

// 驱动的host,若需账密:http://es_username:password@127.0.0.1:9200SCOUT_ELASTIC_HOST=elasticsearch:9200// 驱动SCOUT_DRIVER=elastic// 队列配置,数据量大时建议开启SCOUT_QUEUE=true

5.安装 predis/predis

composer require predis/predis

初始化 elatic Template

这里以 artisan 命令的方式配置 生成命令文件

php artisan make:command EsInit
<?phpnamespace App\\Console\\Commands;use App\\Services\\HttpService;use Illuminate\\Console\\Command;class EsInit extends Command{  /**   * The name and signature of the console command.   *   * @var string   */  protected $signature = 'es:init';  /**   * The console command description.   *   * @var string   */  protected $description = 'init laravel es for article';  /**   * Create a new command instance.   *   * [@return](https://learnku.com/users/31554) void   */  protected  $http;  public function __construct()  {      parent::__construct();      parent::__construct();      $this->http = new HttpService();  }  /**   * Execute the console command.   *   * [@return](https://learnku.com/users/31554) mixed   */  public function handle()  {      $this->createTemplate();  }  protected function createTemplate()  {      $aData = [          /*          * 这句是取在scout.php(scout是驱动)里我们配置好elasticsearch引擎的index项。          * PS:其实都是取数组项,scout本身就是return一个数组,          * scout.elasticsearch.index就是取          * scout[elasticsearch][index]          * */          'template'=>config('scout.elasticsearch.index'),          'mappings'=>[              'articles' => [                  'properties' => [                      'title' => [                          'type' => 'text'                      ],                      'content' => [                          'type' => 'text'                      ],                      'created_at' => [                          'format' => 'yy-MM-dd HHss',                          'type' => 'date'                      ],                      'updated_at' => [                          'format' => 'yy-MM-dd HHss',                          'type' => 'date'                      ]                  ]              ]          ],      ];      $url = config('scout.elasticsearch.hosts')[0] . '/' . '_template/rtf';      $this->http->put($url,$aData,'json');  }}

生成检索 model

php artisan make:model Models/Article

创建 model 索引配置文件

Elasticsearch\\ArticleIndexConfigurator.php

<?phpnamespace App\\Elasticsearch;use ScoutElastic\\IndexConfigurator;use ScoutElastic\\Migratable;class ArticleIndexConfigurator extends IndexConfigurator{  use Migratable;  protected $name = 'articles';  /**   * @var array   */  protected $settings = [      'analysis' => [          'analyzer' => [              'es_std' => [                  'type' => 'standard',                  'stopwords' => '_spanish_'              ]          ]      ]  ];}

创建 model 检索规则文件

Elasticsearch\\SearchRules\\ArticleRule.php

<?phpnamespace App\\Elasticsearch\\SearchRules;use ScoutElastic\\SearchRule;class ArticleRule extends SearchRule{  /*   * @inheritdoc   */  public function buildHighlightPayload()  {      return [          'fields' => [              'title' => [                  'type' => 'unified',              ],              'content' => [                  'type' => 'unified',              ],          ]      ];  }  //进行 match 搜索,会分词  public function buildQueryPayload()  {      $query = $this->builder->query;      return [          'must' => [              'query_string' => [                  'query' => $query,              ],          ],      ];  }}

设置 model Mapping 及检索字段

class Article extends Model{    protected $indexConfigurator = ArticleIndexConfigurator::class;    use Searchable;    /**     * 检索规则     * @var string[]     */    protected $searchRules = [        ArticleRule::class    ];    // 设置模型字段的映射关系    protected $mapping = [        'properties' => [            'id' => [                'type' => 'integer',            ],            'title' => [                'type' => 'text',                'analyzer' => 'ik_max_word',                'search_analyzer' => 'ik_max_word',                'index_options' => 'offsets',                'store' => true            ],            'content' => [                'type' => 'text',                'analyzer' => 'ik_max_word',                'search_analyzer' => 'ik_max_word',                'index_options' => 'offsets',                'store' => true            ],            'number' => [                'type' => 'integer',            ],        ],    ];    /**     * 设置 es 检索返回的字段     * [@return](https://learnku.com/users/31554) array     */    public function toSearchableArray() {        return [            'id' => $this->id,            'title' => $this->title,            'content' => $this->content,        ];    }}

使用步骤

生成 elatic Template 类似 mysql 表结构

php artisan es:init

更新 elatic 类型映射

php artisan elastic:update-mapping "App\\Models\\Article"

数据库数据导入 elatic

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

PS: 其他命令

清空 elatic 数据

php artisan scout:flush "App\\Models\\Article"

使用检索

 $query = Article::search('二胡')            ->paginateRaw(3,'article',1);        dd($query->items()['hits']);

其他使用请自行查看文档

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 教你在laravel中如何使用elaticsearch(步骤分明) https://www.jike1995.com/36140.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务