1️⃣ Elasticsearch
的基本概念:
- 索引 (index) 每个索引相当于
MySQL
中的database
,可以创建一个索引叫laravel56_shop
,每个索引中有多个类型(type)
- 类型 (type) 每个类型相当于
MySQL
中的table
表, 可以创建一个product
类型(对应 MySQL 中的表),或者一个order
类型; 每个 类型中有多个文档(document)
;- 文档(document) 每个文档相当于
MySQL
表中的每一行数据; 在这个搜索需求中每个文档相当于一个商品product
;每一个文档中有多个字段(field)
;- 字段 (field) 相当于
MySQL
中每一个行数据的查询字段;本示例中product 文档
中,需要查询的字段有title
,descr
字段;执行搜索时,只搜索title
和descr
中包含搜索词的;- 模板 (template) 每一个索引中的每一个字段,都有哪些特殊的设置,比如
product
中使用什么分析器,搜索使用什么数据类型(string ....
) 这些都需要在模板中需要配置的,配置模板的时候需要指定模板运用那个索引上面,就可以把模板和索引对应上;
- 如果没有指定文档的
id
ES
会默认生成一个id
-
ES
遵循rest API
的设计,每个参数都有指定的意义;
$ curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user": "张三",
"title": "工程师",
"desc": "数据库管理"
}'
- 以上代码的意思是:向
accounts
的索引插入数据 ,类型是person
,插入的文档id
是1
,文档的内容字段是user
title
desc
;
2️⃣ 搜索实现的基本步骤
- 安装
ElasticSearch
和ik
插件(中文分词插件)
本示例使用
ElasticSearch
的集成包 elasticsearch-rtf
使用注意事项:
java
版本 大于1.8
- 系统可用内存
>2G
- 如果内存小,只需要使用
ik
的话,可以参考以下方法卸载其他插件;
- 列出所有插件
GitHub
下载完后 进入elasticsearch-rtf-master
目录,使用命令./bin/elasticsearch-plugin list
列出所有插件;- 下载不需要的插件
使用命令
./bin/elasticsearch-plugin list > /tmp/plugin.log
#将所有的插件保存在/tmp/plugin.log
文件中;
vim /tmp/plugin.log
#进入该文件将analysis-ik
插件删除掉,保存退出;
cat /tmp/plugin.log | xargs -I {} ./bin/elasticsearch-plugin remove {}
#先将所有的插件打印查来,然后使用xargs
将插件下载删除;
- 更多使用请阅读 该 GitHub
- 启动
ES
命令:./bin/elasticsearch -d
,然后访问127.0.0.1:9200
测试安装;
-
ElasticSearch
的Laravel scout
包的安装
安装 laravel/scout : 参考laravel文档
安装ElasticSearch laravel驱动
参考Github
配置ES
驱动
'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
//增加一个驱动
'elasticsearch' => [
'index' => env('ELASTICSEARCH_INDEX', 'laravel56_shop'),
'hosts' => [
env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
],
],
3️⃣ . 创建 mylaravel
的索引和模板,并把索引和模板进行关联
- 索引的建立和建立模板:
- 使用
Laravel
自定义命令行的
1.创建Command
php artisan make:command ESInit
;#会生成一个Console/Commands
文件夹和ESInit.php
的文件
2.编辑handle
<?php
namespace App\Console\Commands;
use GuzzleHttp\Client;
use Illuminate\Console\Command;
class ESinit extends Command
{
/**
* 控制台命令的名称和签名。
*
* @var string
*/
protected $signature = 'es:init';
/**
* 控制台命令的描述
*
* @var string
*/
protected $description = 'init laravel elasticsearch for shopTitle';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
* 向ES中发送reset风格的请求
* @return mixed
*/
public function handle()
{
//创建template
$client = new Client();
$url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp';
$params = [
'json' => [
'template' => config('scout.elasticsearch.index'),
'mappings' => [
'_default_' => [
'dynamic_templates' => [
[
'strings' => [
'match_mapping_type' => 'string',
'mapping' => [
'type' => 'text',
'analyzer' => 'ik_smart',
'fields' => [
'keyword' => [
'type' => 'keyword'
],
],
],
],
]
],
],
],
],
];
//想URL发送参数创建template
$client->put($url, $params);
//做记录 显示在命令行
$this->info('============ 创建模板成功 ==============');
//创建index
$url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
$params = [
'json' => [
'settings' => [
'refresh_interval' => '5s',
'number_of_shards' => 1,
'number_of_replicas' => 0,
],
'mappings' => [
'_default_' => [
'_all' => [
'enabled' => false
],
],
],
],
];
$client->put($url, $params);
$this->info('============ 创建索引成功 ==============');
}
}
3.挂载
进入编辑App\Console\Kernel.php
/**
* 将ESInit类加入到 protected $commands数据中
*
* @var array
*/
protected $commands = [
ESinit::class
];
使用命令
php artisan
检查该命令是否生效
4️⃣ . 导入数据库中已有的数据到 ElasticSearch
修改
product
模型
-
product.php
中:
<?php
namespace App\Models\Admin;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
/**
* Class Product
* @package App\Models\Admin
*/
class Product extends Model
{
use Searchable;
/**
* 定义索引里的type值,重写
* @return string
*/
public function searcheableAs()
{
return "product";
}
/**
* 定义那些字段需要搜索
* @return array
*/
public function searchableArray()
{
return [
'title' => $this->title,
'descr' => $this->descr
];
}
}
导入
product
数据
- 使用命令
php artisan scout:import App\Product
#就可以将数据库中的数据导入 - 使用数据库的数据测试 , 浏览器访问
http://127.0.0.1:9200/laravel56_shop/product/1
测试数据的增删
- 当向数据表中添加一条数据的时候,会自动导入到
ES
中