前置
开发环境
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