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 相关文章推荐
判断Keep-Alive模式的HTTP请求的结束的实现代码
Aug 06 PHP
打造超酷的PHP数据饼图效果实现代码
Nov 23 PHP
PHP的异常处理类Exception的使用及说明
Jun 13 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 PHP
php实现PDO中捕获SQL语句错误的方法
Feb 16 PHP
php面向对象之反射功能与用法分析
Mar 29 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
PHP5.6读写excel表格文件操作示例
Feb 26 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
PHP常用正则表达式集锦
2014/08/17 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
javascript工具库代码
2012/03/29 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
js微信分享实现代码
2020/10/11 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
了解重排与重绘
2019/05/29 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
opencv实现简单人脸识别
2021/02/19 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
python全栈开发语法总结
2020/11/22 Python
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
初中音乐教学反思
2014/01/12 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python