Laravel使用scout集成elasticsearch做全文搜索的实现方法


Posted in PHP onNovember 30, 2018

本文介绍了Laravel使用scout集成elasticsearch做全文搜索的实现方法,分享给大家,具体如下:

安装需要的组件

composer require tamayo/laravel-scout-elastic
composer require laravel/scout

如果composer require laravel/scout 出现报错

Using version ^6.1 for laravel/scout
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

 Problem 1
  - tamayo/laravel-scout-elastic 4.0.0 requires laravel/scout ^5.0 -> satisfiable by laravel/scout[5.0.x-dev].
  - tamayo/laravel-scout-elastic 4.0.0 requires laravel/scout ^5.0 -> satisfiable by laravel/scout[5.0.x-dev].
  - tamayo/laravel-scout-elastic 4.0.0 requires laravel/scout ^5.0 -> satisfiable by laravel/scout[5.0.x-dev].
  - Conclusion: don't install laravel/scout 5.0.x-dev
  - Installation request for tamayo/laravel-scout-elastic ^4.0 -> satisfiable by tamayo/laravel-scout-elastic[4.0.0].


Installation failed, reverting ./composer.json to its original content.

那么使用命令

composer require laravel/scout ^5.0

修改一下配置文件(config/app.php),添加如下两个provider

'providers' => [ 
    //es search 加上以下内容 
    Laravel\Scout\ScoutServiceProvider::class, 
    ScoutEngines\Elasticsearch\ElasticsearchProvider::class, 
]

添加完成,执行命令,生成config文件

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

修改config/scout.php

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

  'elasticsearch' => [
    'index' => env('ELASTICSEARCH_INDEX', '你的Index名字'),
    'hosts' => [
      env('ELASTICSEARCH_HOST', ''),
    ],
  ],

在.env 配置ES的 账号:密码@连接

ELASTICSEARCH_HOST=elastic:密码@你的域名.com:9200

创建一个生成mapping的命令行文件,到 app/Console/Commands

<?php
namespace App\Console\Commands;
use GuzzleHttp\Client;
use Illuminate\Console\Command;

class ESInit extends Command {

  protected $signature = 'es:init';

  protected $description = 'init laravel es for news';

  public function __construct() { parent::__construct(); }

  public function handle() { //创建template
    $client = new Client(['auth'=>['elastic', 'Wangcai5388']]);
    $url = config('scout.elasticsearch.hosts')[0] . '/_template/news';
    $params = [
      'json' => [
        'template' => config('scout.elasticsearch.index'),
        'settings' => [
          'number_of_shards' => 5
        ],
        'mappings' => [
          '_default_' => [
            'dynamic_templates' => [
              [
                'strings' => [
                  'match_mapping_type' => 'string',
                  'mapping' => [
                    'type' => 'text',
                    'analyzer' => 'ik_smart',
                    'ignore_above' => 256,
                    'fields' => [
                      'keyword' => [
                        'type' => 'keyword'
                      ]
                    ]
                  ]
                ]
              ]
            ]
          ]
        ]
      ]
    ];
    $client->put($url, $params);

    // 创建index
    $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');

    $params = [
      'json' => [
        'settings' => [
          'refresh_interval' => '5s',
          'number_of_shards' => 5,
          'number_of_replicas' => 0
        ],
        'mappings' => [
          '_default_' => [
            '_all' => [
              'enabled' => false
            ]
          ]
        ]
      ]
    ];
    $client->put($url, $params);

  }
}

在kernel中注册这个命令

<?php

namespace App\Console;

use App\Console\Commands\ESInit;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
  /**
   * The Artisan commands provided by your application.
   *
   * @var array
   */
  protected $commands = [
    ESInit::class
  ];

执行这个命令 生成 mapping

php artisan es:init

修改model支持 全文搜索

<?php
namespace App\ActivityNews\Model;

use App\Model\Category;
use App\Star\Model\Star;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;


class ActivityNews extends Model
{
  use Searchable;

  protected $table = 'activity_news';
  protected $fillable = [
    'type_id',
    'category_id',
    'title',
    'sub_title',
    'thumb',
    'intro',
    'star_id',
    'start_at',
    'end_at',
    'content',
    'video_url',
    'status',
    'is_open',
    'is_top',
    'rank',
  ];

  public function star()
  {
    return $this->hasOne(Star::class, 'id', 'star_id');
  }

  public function category()
  {
    return $this->hasOne(Category::class, 'id', 'category_id');
  }

  public static function getActivityIdByName($name)
  {
    return self::select('id')
      ->where([
        ['status', '=', 1],
        ['type_id', '=', 2],
        ['title', 'like', '%' . $name . '%']
      ])->get()->pluck('id');
  }

}

导入全文索引信息

php artisan scout:import "App\ActivityNews\Model\ActivityNews"

测试简单的全文索引

php artisan tinker

>>> App\ActivityNews\Model\ActivityNews::search('略懂皮毛')->get();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
编写PHP的安全策略
Oct 09 PHP
php之对抗Web扫描器的脚本技巧
Oct 01 PHP
PHP 字符串正则替换函数preg_replace使用说明
Jul 15 PHP
使用php实现截取指定长度
Aug 06 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
Jan 26 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
Aug 18 PHP
php生成gif动画的方法
Nov 05 PHP
php上传图片获取路径及给表单字段赋值的方法
Jan 23 PHP
PHP线程的内存回收问题
Jul 08 PHP
thinkPHP5.0框架独立配置与动态配置方法
Mar 17 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
May 02 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 #PHP
php实现每日签到功能
Nov 29 #PHP
PHP序列化的四种实现方法与横向对比
Nov 29 #PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 #PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 #PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 #PHP
PHP实现小程序批量通知推送
Nov 27 #PHP
You might like
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
php strtotime 函数UNIX时间戳
2009/01/14 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
vue v-model动态生成详解
2018/06/30 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
数控技术专业推荐信
2013/11/01 职场文书
自我评价如何写好?
2014/01/05 职场文书
团组织关系介绍信
2014/01/12 职场文书
中学校庆方案
2014/03/17 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
一篇文章弄懂Python中的内建函数
2021/08/07 Python