Laravel使用scout集成elasticsearch做全文搜索的实现方法
author:一佰互联 2019-04-25   click:162

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

安装需要的组件

composer require tamayo/laravel-scout-elasticcomposer require laravel/scout 

如果composer require laravel/scout 出现报错

Using version ^6.1 for laravel/scout./composer.json has been updatedLoading composer repositories with package informationUpdating 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 加上以下内容     LaravelScoutScoutServiceProvider::class,     ScoutEnginesElasticsearchElasticsearchProvider::class, ]

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

php artisan vendor:publish --provider="LaravelScoutScoutServiceProvider"

修改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

<?phpnamespace AppConsoleCommands;use GuzzleHttpClient;use IlluminateConsoleCommand;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中注册这个命令

<?phpnamespace AppConsole;use AppConsoleCommandsESInit;use IlluminateConsoleSchedulingSchedule;use IlluminateFoundationConsoleKernel 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支持 全文搜索

<?phpnamespace AppActivityNewsModel;use AppModelCategory;use AppStarModelStar;use IlluminateDatabaseEloquentModel;use LaravelScoutSearchable;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 "AppActivityNewsModelActivityNews"

测试简单的全文索引

php artisan tinker>>> AppActivityNewsModelActivityNews::search("略懂皮毛")->get();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网页设计。