美文网首页
laravel下elasticsearch+analysis-i

laravel下elasticsearch+analysis-i

作者: 哥本哈登_sketch | 来源:发表于2018-08-22 00:13 被阅读0次

    这篇文章需要建立在 elasticsearch 已经配置完成的前提下;
    如果还没安装 elasticsearch ;
    请先出门左转 elasticsearch和analysis-ik的安装使用;

    新建一个项目演示;

    laravel new elasticsearch
    

    Bash

    Copy

    创建一个文章表和文章模型;

    php artisan make:model Models/Article -m
    

    Bash

    Copy

    添加文章标题和内容字段
    /database/migrations/2018_06_03_080124_create_articles_table.php

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title')->default('')->comment('标题');
            $table->mediumText('content')->comment('文章内容');
            $table->timestamps();
        });
    }
    

    PHP

    Copy

    修改 .env 数据库配置项;

    DB_DATABASE=homestead
    DB_USERNAME=homestead
    DB_PASSWORD=secret
    

    Bash

    Copy

    运行迁移生成表;

    php artisan migrate
    

    Bash

    Copy

    创建填充文件;

    php artisan make:seed ArticlesTableSeeder
    

    Bash

    Copy

    生成测试数据;

    public function run()
    {
        DB::table('articles')->insert([
            [
                'title' => 'elasticsearch',
                'content' => '一个基于Lucene的企业级搜索引擎'
            ],
            [
                'title' => 'elasticsearch analysis ik',
                'content' => '用于 elasticsearch 的中文分词插件'
            ]
        ]);
    }
    

    PHP

    Copy

    运行填充;

    php artisan db:seed --class=ArticlesTableSeeder
    

    Bash

    Copy

    /routes/web.php

    <?php
    use App\Models\Article;
    
    Route::get('search', function () {
        // 为查看方便都转成数组
        dump(Article::all()->toArray());
    });
    

    PHP

    Copy

    image

    准备工作至此结束;
    下面开始整合入 laravel ;
    有三种方案可供选择;

    第一种方案是 laravel-scout-elastic ;
    这种基于 scout 的;
    好处我们上篇文章已经写了;
    增删改操作后自动更新索引;
    配置起来也简单方便;
    可以非常方便的在各种基于 scout 搜索方案间切换;
    但是它并不理解东方神秘的方块字;
    不能自定义分词器;
    也不能愉快的完成中文搜索功能;

    另一种是 Elasticquent ;
    这种是独立于 scout 的;
    它提供了符合 laravel 风格的操作索引的 api ;
    并且和模型结合在了一起可以方便的进行搜索;
    可以自定义分词愉快的中文搜索了;
    但是结合的不像 scout 那样紧密;
    对数据库增删改后还需要手动同步对索引进行相同的操作;
    想便捷点也需要自己绑定监听增删改的事件;

    那能不能有一个开箱即用还支持中文搜索的方案;
    于是有了第三种方案 baijunyao/laravel-scout-elasticsearch 横空出世;
    安装 driver ;

    composer require baijunyao/laravel-scout-elasticsearch
    

    Bash

    Copy

    添加 Provider ;
    config/app.php

    'providers' => [
    
        // ...
    
        /**
         * Elasticsearch全文搜索
         */
        Laravel\Scout\ScoutServiceProvider::class,
        Baijunyao\LaravelScoutElasticsearch\ElasticsearchServiceProvider::class,
    ],
    

    PHP

    Copy

    发布配置项;

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

    Bash

    Copy

    增加配置项;
    /.env ;

    SCOUT_DRIVER=elasticsearch
    

    Bash

    Copy

    模型中定义全文搜索;
    /app/Models/Article.php

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use Laravel\Scout\Searchable;
    
    class Article extends Model
    {
        use Searchable;
    
        /**
         * 索引的字段
         *
         * @return array
         */
        public function toSearchableArray()
        {
            return $this->only('id', 'title', 'content');
        }
    }
    

    PHP

    Copy

    生成索引;

    php artisan elasticsearch:import "App\Models\Article"
    

    Bash

    Copy

    使用起来也相当简单;
    只需要把要搜索的内容传给 search() 方法即可;
    /routes/web.php

    <?php
    use App\Models\Article;
    
    Route::get('search', function () {
        // 为查看方便都转成数组
        dump(Article::all()->toArray());
        dump(Article::search('功能齐全的搜索引擎')->get()->toArray());
    });
    

    PHP

    Copy

    image

    成功的查出了数据;

    最后我们再测下修改数据后的同步索引;

    routes/web.php

    <?php
    
    use App\Models\Article;
    
    Route::get('search', function () {
        // 为查看方便都转成数组
        dump(Article::all()->toArray());
        dump('下面搜索的是:企业搜索');
        dump(Article::search('企业搜索')->get()->toArray());
        dump('此处把content改为:能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据');
        // 修改 content 测试索引是否会自动同步
        $first = Article::find(1);
        // $first->content = '一个基于Lucene的企业级搜索引擎';
        $first->content = '能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据';
        $first->save();
        // 因 Elasticsearch 同步索引需要点时间此处休眠5秒钟
        sleep(5);
        dump('下面搜索的是:企业搜索');
        dump(Article::search('企业搜索')->get()->toArray());
        dump('下面搜索的是:能胜服务');
        dump(Article::search('能胜服务')->get()->toArray());
    });
    

    PHP

    Copy

    image

    原文链接:
    https://baijunyao.com/article/156

    相关文章

      网友评论

          本文标题:laravel下elasticsearch+analysis-i

          本文链接:https://www.haomeiwen.com/subject/giosiftx.html