Skip to content

在上一篇文章中,我们介绍了 elasticsearch 及其插件的安装和基本配置。在这篇文章中我们将结合 Laravel Scout 介绍一下 elasticsearch 在实际应用场景中的使用。

什么是 scout,如何使用 scout

既然说到 Laravel Scout 那么什么是 laravel-scout 呢?基于官方的定义:laravel-scout 为 laravel 的 Eloquent 模型的全文搜索提供的基于驱动的简单的解决方案。通过对观察者模式的实现,scout 可以很轻易的将你的模型数据同步到你的搜索引擎中去。关于 scout 的安装和基本使用,你可以参考 Scout 全文搜索

安装配置

这里的使用是基于你已经正确的安装和配置 scout 前提下的。另外由于 scout 只自带一个 Algolia 驱动,并未提供基于 elasticsearch 的驱动,所以这里所介绍是基于 babenkoivan/scout-elasticsearch-driver 这个驱动实现的。

安装

php
composer require babenkoivan/scout-elasticsearch-driver

配置驱动

使用下面的命令来发布你的驱动

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

经过上边的步骤你的 config 文件夹中已经生成了 scout_elastic.php 文件,默认情况下它将包含如下的配置。

php
<?php

return [
    'client' => [
        'hosts' => [
            //elasticearch服务的链接地址
            env('SCOUT_ELASTIC_HOST', 'localhost:9200')
        ]
    ],
    //是否自动更新映射
    'update_mapping' => env('SCOUT_ELASTIC_UPDATE_MAPPING', true),
    'indexer' => env('SCOUT_ELASTIC_INDEXER', 'single'),
    'document_refresh' => env('SCOUT_ELASTIC_DOCUMENT_REFRESH')
];

创建索引配置文件

php
php artisan make:index-configurator Search\\Indexes\\PostsIndexConfigurator

配置信息

php
<?php namespace App\Search\Indexes;

use ScoutElastic\IndexConfigurator;
use ScoutElastic\Migratable;

class PostsIndexConfigurator extends IndexConfigurator
{
    use Migratable;

    //这里是索引的名称,默认情况下使用的是模型名称
    protected $name = 'blog';

    //这里是索引的配置,是典型的elasticsrarch风格。
    protected $settings = [
        'analysis' => [
            'analyzer' => [
                'es_std' => [
                    'type' => 'ik_smart', //这里是分词器,由于使用的中文所以使用的是ik_smart分词器
                    'stopwords' => '_chinese_'
                ]
            ]
        ]
    ];
}

创建搜索配置

php
php artisan make:search-rule Search\\Rules\\PostsIndexConfigurator

配置信息

php
<?php namespace App\Search\Rules;

use ScoutElastic\SearchRule;

class PostsSearchRule extends SearchRule
{
    /**
     * elasticsearch搜索关键词的高亮配置
     */
    public function buildHighlightPayload()
    {
        return [
            'fields' => [
                'title' => [
                    'type' => 'plain'
                ],
                'summary' => [
                    'type' => 'plain'
                ],
                'content' => [
                    'type' => 'plain'
                ],
            ]
        ];
    }

    /**
     * 查询条件,elasticsearch bool过滤器构建
     * @inheritdoc
     */
    public function buildQueryPayload()
    {
        return [
            'must' => [
                'multi_match' => [
                    'query' => $this->builder->query,
                    'fields' => ['title', 'summary','content'],
                ]
            ]
        ];
    }
}

模型的配置使用

php
use Searchable;
//指明所使用的索引配置
protected $indexConfigurator = PostsIndexConfigurator::class;
//指明所使用的搜索配置
protected $searchRules = [
    PostsSearchRule::class
];
//配置模型到elasticsearch的字段映射
protected $mapping = [
    'properties' => [
        'text' => [
            'type' => 'text',
            'fields' => [
                'title' => [
                    'type' => 'text',
                ]
            ]
        ],
    ]
];

基本命令的使用

在配置好了如上的数据,你需要做的就是使用下边的命令来将数据导入到 elasticsearch 中使用了。

php
php artisan elastic:create-index  Model//创建索引
php artisan scout:import  Model//导入数据到索引中

实际的使用

通过上边的配置和数据迁移之后,在控制器中你只需下面一行就可以很方便的使用上 elasticsearch 的搜索服务了。

php
$posts = Posts::search($keyword)->where('is_valid', 1)->with('tags')->paginate(8);

到这里本文就结束了,上边只介绍了 babenkoivan/scout-elasticsearch-driver 的基本使用,关于其他的一些更详细的使用信息你可以点击 插件 Github 主页参考使用。