分类: Laravel PHP

laravel中应用elasticsearch全文搜索服务


作者:朱培鑫

时间:2018-05-01

环境准备

  1. JDK8+
  2. 系统可用内存>2G
  3. laravel 5.6 (其他版本自行查看laravel文档,配置基本一致)

下载安装JDK

提供两个链接至JDK8的下载链接,如需要JDK10版本请自行到 下载链接 下载

版本大小下载链接
Windows x86199.1 MBjdk-8u171-windows-i586.exe
Windows x64207.27 MBjdk-8u171-windows-x64.exe

下载完成后,按照提示进行安装,安装完成后,配置系统环境变量。

1、我的Java JDK 安装位置
1.png

2、对应配置的环境变量,注意这里JAVA_HOME 环境变量地址指向JAVA JDK的根目录,不是bin目录,elasticsearch要求。
2.png

下载elasticsearch-rtf中文搜索集成包

下载地址:https://github.com/medcl/elasticsearch-rtf

1、下载完成后解压,解压完成后的目录结构如下

20180503_212343.png

2、命令行切换至elasticsearch-rtf的根目录 (注意命令中是"\")
键入 bin\elasticsearch-plugin list 查看elasticsearch-rtf已经安装的扩展包,可以看到elasticsearch-rtf已经内置安装了很多的扩展包,我们只需要其中的analysis-ik(不可以删除),可以删除其他扩展包,减少内存占用, 删除扩展包的指令 bin\elasticsearch-plugin remove 包名

3、启动elasticsearch-rtf
Mac/Linux:

cd elasticsearch/bin
./elasticsearch
sudo -u ops ES_JAVA_OPTS="-Xms2024m -Xmx2024m" ./bin/elasticsearch -d

Windows:

cd bin
elasticsearch.bat

20180503_213821.png

这时访问 http://127.0.0.1:9200/看到如下反馈,证明elasticsearch已经成功运行。

20180503_213925.png

Laravel的scout包安装及Laravel-es包安装

原文地址:http://laravelacademy.org/post/9038.html
1、切换至laravel项目根目录下
2、首先,我们通过 Composer 包管理器来安装 Scout:composer require laravel/scout
3、安装完成后,需要通过 Artisan 命令 vendor:publish 发布 Scout 配置,该命令会发布配置文件 scout.php 到 config 目录:
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
4、打开config目录下的app.php 在providers数组中新增 Laravel\Scout\ScoutServiceProvider::class
5、编辑scout.php

<?php
return [
    'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
    'prefix' => env('SCOUT_PREFIX', ''),
    'queue' => env('SCOUT_QUEUE', false),
    'chunk' => [
        'searchable' => 500,
        'unsearchable' => 500,
    ],
    'soft_delete' => false,
    'algolia' => [
        'id' => env('ALGOLIA_APP_ID', ''),
        'secret' => env('ALGOLIA_SECRET', ''),
    ],
    'elasticsearch' => [
        'index' => env('ELASTICSEARCH_INDEX', 'laravel'),
        'hosts' => [
            env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
        ],
    ],
];

6、安装laravel-scout-elastic
下载地址:https://github.com/ErickTamayo/laravel-scout-elastic
composer require tamayo/laravel-scout-elastic
编辑config/app.php

// config/app.php
'providers' => [
    ...
    Laravel\Scout\ScoutServiceProvider::class,
    ...
    ScoutEngines\Elasticsearch\ElasticsearchProvider::class,
],

使用laravel的Command实现搜索引擎索引和模板的建立

1、运行命令 composer require guzzlehttp/client
2、laravel项目根目录下键入 php artisan make:command ESInit
3、编辑 app/Console/Commands/ESInit.php 如下

<?php

namespace App\Console\Commands;

use GuzzleHttp\Client;
use Illuminate\Console\Command;

class ESInit extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'es:init';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'init laravel es for post';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // 创建 template
        $client = new Client();

        $url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp';
        $client->delete($url); // 此语句第一次创建时注释掉,否则会报找不到url,运行过后开启,否则下次运行会报已存在错误

        $param = [
            'json' => [
                'template' => config('scout.elasticsearch.index'),
                'mappings' => [
                    '_default_' => [
                        'dynamic_templates' => [
                            [
                                'strings' => [
                                    'match_mapping_type' => 'string',
                                    'mapping' => [
                                        'type' => 'text',
                                        'analyzer' => 'ik_smart',
                                        'fields' => [
                                            'keyword' => [
                                                'type' => 'keyword'
                                            ],
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ];
        $client->put($url,$param);
        $this->info('=========== 创建模板成功 =============');

        // 创建index
        $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
        $client->delete($url);// 此语句第一次创建时注释掉,否则会报找不到url,运行过后开启,否则下次运行会报已存在错误
        $param = [
            'json' => [
                'settings' => [
                    'refresh_interval' => '5s',
                    'number_of_shards' => 1,
                    'number_of_replicas' => 0
                ],
                'mappings' => [
                    '_default_' => [
                        '_all' => [
                            'enabled' => false
                        ]
                    ]
                ]
            ]
        ];
        $client->put($url,$param);
        $this->info('=========== 创建索引成功 =============');
    }
}

3、php artisan 这时可以看到我们的命令已经出现在命令列表中

20180503_220552.png

4、运行 php artisan es:init

20180503_220931.png
5、模板索引创建成功

关联模型并使用scout命令导入数据

1、编辑对应model,这里以medicine model为例

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Medicine extends Model
{
    use Searchable;

    // 定义索引里面的type值
    public function searchableAs()
    {
        return "medicine";
    }

    // 定义有哪些字段需要搜索
    public function toSearchableArray()
    {
        return [
            'name' => $this->name,
            'shiyan' => $this->shiyan,
        ];
    }

    protected $table = 'medicines';
    public $timestamps = true;
}

2、填充数据到索引 终端执行命令 php artisan scout:import "App\Models\Medicine",请自行参考自己的模型,并按照命名空间输入对应参数

20180503_221739.png
3、浏览器端输入 http://127.0.0.1:9200/laravel/medicine/1 得到结果

20180503_221826.png

4.索引模型已经与数据库模型关联,其会自动同步数据

控制器建立

public function search(){
        $pp = Medicine::search('aa')->paginate(20);
        return $pp;
    }

分页选项可以替换为get(),elasticsearch将默认展示10条数据,至此已经成功在laravel中应用了elasticsearch全文搜索。

( 本篇完 )