Laravel elasticsearch 案例

前置

开发环境
	Laravel 8
	Docker
	mysql 5.7
	elasticsearch 7.9.1
	ik 7.9.1
1.数据库
CREATE TABLE `posts` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(200) NOT NULL DEFAULT '',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `post-title` (`title`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;

2.Docker 安装 Elasticsearch 容器

2-1.将以下内容 追加 docker-compose.yml
  elasticsearch:
      container_name: xb_elasticsearch
      image: elasticsearch:7.9.1
      environment:
        - "discovery.type=single-node"
      networks:
        - wb_net
      ports:
        - 9200:9200
      volumes:
        - './storage/elasticsearch:/var/lib/elasticsearch'
2-2.重新构建容器 docker-compose up -d && docker-compose restart

3.进入 xb_elasticsearch 容器 并安装 IK 分词器

 docker exec -it xb_elasticsearch bash
 
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip

 -y
 
 exit;

4.重启容器 docker-compose restart

验证 elasticsearch 是否安装成功,点击我 如下图所示安装成功

在这里插入图片描述

5.安装composer 包 并 发布服务

composer require laravel/scout
composer require matchish/laravel-scout-elasticsearch
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

6.env 下追加:

SCOUT_DRIVER=Matchish\ScoutElasticSearch\Engines\ElasticSearchEngine
ELASTICSEARCH_HOST=物理机ip(或容器名称):9200

7.注册服务 config/app.php.providers

\Matchish\ScoutElasticSearch\ElasticSearchServiceProvider::class

8.清除配置缓存

php artisan config:clear

9.创建索引配置文件 (config/elasticsearch.php)

<?php
return [
 'indices' => [
     'mappings' => [
         'post-title' => [ //数据库索引名称
             "properties"=>  [
                 "title"=>  [ //字段
                     "type"=>  "text",
                     "analyzer"=>  "ik_max_word",
                     "search_analyzer"=>  "ik_smart"
                 ]
             ]
         ]
     ]
 ],
];

10.配置Model

<?php
namespace App\Models;
use App\Constants\ErrorResponse;
use App\Filters\PostFilter;
use App\Filters\QueryFilter;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Scout\Searchable;

class Post extends Model {
    use SoftDeletes;
    use Searchable;
    protected $fillable = [
       'title',   
      ];

    public function scopeFilter($query, QueryFilter $filters)
    {
        return $filters->apply($query);
    }


    /**
     * 指定索引
     * @return string
     */
    public function searchableAs()
    {
        return 'post-title';
    }

    /**
     * 设置导入索引的数据字段
     * @return array
     */
    public function toSearchableArray()
    {
        return [
            'title' => self::query()
        ];
    }

    /**
     * 指定 搜索索引中存储的唯一ID
     * @return mixed
     */
    public function getScoutKey()
    {
        return $this->id;
    }

    /**
     * 指定 搜索索引中存储的唯一ID的键名
     * @return string
     */
    public function getScoutKeyName()
    {
        return 'id';
    }
}

11.导入Model

php artisan scout:import

12.测试数据

INSERT INTO `posts` (`title`) VALUES ('看一遍闭着眼都会安装Lua1');

13.创建 ElasticTest

php artisan make:command ElasticTest
<?php

namespace App\Console\Commands;

use App\Models\Post;
use Illuminate\Console\Command;
use Illuminate\Support\Carbon;

class ElasticTest extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'elasticsearch {query}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'elasticsearch test';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $articles = Post::search($this->argument('query'))->get()->toArray();
        dd($articles);
    }
}

elasticsearch 对比 Like 模糊查询

LIke

在这里插入图片描述

elasticsearch

在这里插入图片描述
END

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值