laravel下elasticsearch+analysis-ik实现中文全文搜索

这篇文章需要建立在 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容