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

2019-04-30 11:25:10


参考地址 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

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

PHP

Copy


准备工作至此结束;
下面开始整合入 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

<?phpnamespace 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

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

PHP

Copy


成功的查出了数据;


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

routes/web.php

<?phpuse 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



  • 2018-11-17 21:05:48

    Android ANR发生的原因总结和解决办法

    ANR的全称是application not responding,是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。

  • 2018-11-17 21:08:09

    Android 单个应用的内存限制

    获取Android手机应用内存大小 手机不同其性能也不同,手机本身内存可能有大有小,所以针对每个应用的内存大小也不相同。

  • 2018-11-17 21:11:14

    Android中App可分配内存的大小

     结果:(1)未设定属性android:largeheap = "true"时,可以申请到的最大内存空间为221M。      (2)设定属性android:largeheap = "true"时, 可以申请的最大内存空间为478M,是原来的两倍多一些。

  • 2018-11-17 22:44:53

    LeakCanary,30分钟从入门到精通

    在性能优化中,内存是一个不得不聊的话题;然而内存泄漏,显示已经成为内存优化的一个重量级的方向。当前流行的内存泄漏分析工具中,不得不提的就是LeakCanary框架;这是一个集成方便, 使用便捷,配置超级简单的框架,实现的功能却是极为强大的。

  • 2018-11-17 22:53:01

    gc for alloc freed

    在数组中选择图片然后显示,然后。。。logcat不断显示GC回收。最后程序黑屏。

  • 2018-11-17 23:25:38

    Android高效内存1:一张图片占用多少内存

    在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时 600 * 800 的,图片占用空间大小假设是 100KB。另外本文知识点也是面试官喜欢问的一个点,看看自己的回答到什么级别了。