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 相关文章推荐
对盗链说再见...
Oct 09 PHP
文件上传的实现
Oct 09 PHP
PHP 获取远程文件内容的函数代码
Mar 24 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
May 10 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
Laravel 4 初级教程之Pages、表单验证
Oct 30 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
分享PHP计算两个日期相差天数的代码
Dec 23 PHP
根据key删除数组中指定的元素实现方法
Mar 02 PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 PHP
laravel5.6实现数值转换
Oct 23 PHP
laravel框架实现敏感词汇过滤功能示例
Feb 15 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
德生H-501的评价与改造
2021/03/02 无线电
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
可输入的下拉框
2006/06/19 Javascript
11款基于Javascript的文件管理器
2009/10/25 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
UI Events 用户界面事件
2012/06/27 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
python读取和保存图片5种方法对比
2018/09/12 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
生产车间主任的个人自我鉴定
2013/10/25 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
投标担保书范文
2014/04/02 职场文书
开工仪式策划方案
2014/05/23 职场文书
测绘工程专业求职信
2014/07/15 职场文书
个人违纪检讨书
2014/09/15 职场文书
假期读书倡议书3篇
2019/08/19 职场文书