- 上一篇: JavaScript简介
laravel中应用elasticsearch全文搜索服务
环境准备
- JDK8+
- 系统可用内存>2G
- laravel 5.6 (其他版本自行查看laravel文档,配置基本一致)
下载安装JDK
提供两个链接至JDK8的下载链接,如需要JDK10版本请自行到 下载链接 下载
版本 | 大小 | 下载链接 |
---|---|---|
Windows x86 | 199.1 MB | jdk-8u171-windows-i586.exe |
Windows x64 | 207.27 MB | jdk-8u171-windows-x64.exe |
下载完成后,按照提示进行安装,安装完成后,配置系统环境变量。
1、我的Java JDK 安装位置
2、对应配置的环境变量,注意这里JAVA_HOME 环境变量地址指向JAVA JDK的根目录,不是bin目录,elasticsearch要求。
下载elasticsearch-rtf中文搜索集成包
下载地址:https://github.com/medcl/elasticsearch-rtf
1、下载完成后解压,解压完成后的目录结构如下
2、命令行切换至elasticsearch-rtf的根目录 (注意命令中是"\")
键入 bin\elasticsearch-plugin list
查看elasticsearch-rtf已经安装的扩展包,可以看到elasticsearch-rtf已经内置安装了很多的扩展包,我们只需要其中的analysis-ik(不可以删除),可以删除其他扩展包,减少内存占用, 删除扩展包的指令 bin\elasticsearch-plugin remove 包名
3、启动elasticsearch-rtf
Mac/Linux:
cd elasticsearch/bin
./elasticsearch
sudo -u ops ES_JAVA_OPTS="-Xms2024m -Xmx2024m" ./bin/elasticsearch -d
Windows:
cd bin
elasticsearch.bat
这时访问 http://127.0.0.1:9200/
看到如下反馈,证明elasticsearch已经成功运行。
Laravel的scout包安装及Laravel-es包安装
原文地址:http://laravelacademy.org/post/9038.html
1、切换至laravel项目根目录下
2、首先,我们通过 Composer 包管理器来安装 Scout:composer require laravel/scout
3、安装完成后,需要通过 Artisan 命令 vendor:publish
发布 Scout 配置,该命令会发布配置文件 scout.php 到 config 目录:php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
4、打开config目录下的app.php 在providers数组中新增 Laravel\Scout\ScoutServiceProvider::class
5、编辑scout.php
<?php
return [
'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
'prefix' => env('SCOUT_PREFIX', ''),
'queue' => env('SCOUT_QUEUE', false),
'chunk' => [
'searchable' => 500,
'unsearchable' => 500,
],
'soft_delete' => false,
'algolia' => [
'id' => env('ALGOLIA_APP_ID', ''),
'secret' => env('ALGOLIA_SECRET', ''),
],
'elasticsearch' => [
'index' => env('ELASTICSEARCH_INDEX', 'laravel'),
'hosts' => [
env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
],
],
];
6、安装laravel-scout-elastic
下载地址:https://github.com/ErickTamayo/laravel-scout-elastic
composer require tamayo/laravel-scout-elastic
编辑config/app.php
// config/app.php
'providers' => [
...
Laravel\Scout\ScoutServiceProvider::class,
...
ScoutEngines\Elasticsearch\ElasticsearchProvider::class,
],
使用laravel的Command实现搜索引擎索引和模板的建立
1、运行命令 composer require guzzlehttp/client
2、laravel项目根目录下键入 php artisan make:command ESInit
3、编辑 app/Console/Commands/ESInit.php 如下
<?php
namespace App\Console\Commands;
use GuzzleHttp\Client;
use Illuminate\Console\Command;
class ESInit extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'es:init';
/**
* The console command description.
*
* @var string
*/
protected $description = 'init laravel es for post';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// 创建 template
$client = new Client();
$url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp';
$client->delete($url); // 此语句第一次创建时注释掉,否则会报找不到url,运行过后开启,否则下次运行会报已存在错误
$param = [
'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'
],
]
]
]
]
]
]
]
]
];
$client->put($url,$param);
$this->info('=========== 创建模板成功 =============');
// 创建index
$url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
$client->delete($url);// 此语句第一次创建时注释掉,否则会报找不到url,运行过后开启,否则下次运行会报已存在错误
$param = [
'json' => [
'settings' => [
'refresh_interval' => '5s',
'number_of_shards' => 1,
'number_of_replicas' => 0
],
'mappings' => [
'_default_' => [
'_all' => [
'enabled' => false
]
]
]
]
];
$client->put($url,$param);
$this->info('=========== 创建索引成功 =============');
}
}
3、php artisan 这时可以看到我们的命令已经出现在命令列表中
4、运行 php artisan es:init
5、模板索引创建成功
关联模型并使用scout命令导入数据
1、编辑对应model,这里以medicine model为例
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Medicine extends Model
{
use Searchable;
// 定义索引里面的type值
public function searchableAs()
{
return "medicine";
}
// 定义有哪些字段需要搜索
public function toSearchableArray()
{
return [
'name' => $this->name,
'shiyan' => $this->shiyan,
];
}
protected $table = 'medicines';
public $timestamps = true;
}
2、填充数据到索引 终端执行命令 php artisan scout:import "App\Models\Medicine"
,请自行参考自己的模型,并按照命名空间输入对应参数
3、浏览器端输入 http://127.0.0.1:9200/laravel/medicine/1 得到结果
4.索引模型已经与数据库模型关联,其会自动同步数据
控制器建立
public function search(){
$pp = Medicine::search('aa')->paginate(20);
return $pp;
}
分页选项可以替换为get(),elasticsearch将默认展示10条数据,至此已经成功在laravel中应用了elasticsearch全文搜索。
本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:http://zhupeixin.com/article/2018/05/laravelelasticsearch
( 本篇完 )
- 下一篇: Audio.js