不败君

前端萌新&初级后端攻城狮

Laravel 7 使用 Elasticsearch

Laravel 7 使用 Elasticsearch

2020-09-25 17:53:42

围观(4150)

下载安装 ElasticSearch

下载地址:https://www.elastic.co/cn/downloads/elasticsearch

下载完成后解压并运行 bin 目录下的 elasticsearch.bat

运行后打开浏览器访问:http://127.0.0.1:9200/

如果页面正常返回显示:

{
  "name" : "DESKTOP-NO0J8O3",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "vy-Md8ouRSS812SvxH-dmg",
  "version" : {
    "number" : "7.9.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "d34da0ea4a966c4e49417f2da2f244e3e97b4e6e",
    "build_date" : "2020-09-23T00:45:33.626720Z",
    "build_snapshot" : false,
    "lucene_version" : "8.6.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

即为成功运行 ElasticSearch.


安装 Laravel Scout

Laravel Scout 可以解决模型自动同步搜索索引的问题。

官方包地址:https://packagist.org/packages/laravel/scout

文档地址:https://laravel.com/docs/master/scout

使用 Composer 安装:

composer require laravel/scout

发布资源:

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"


安装 Elasticsearch PHP client

composer require elasticsearch/elasticsearch


安装 laravel-scout-elastic

composer require tamayo/laravel-scout-elastic


安装 IK 分词器

官方地址:https://github.com/medcl/elasticsearch-analysis-ik

发版地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

下载后在 ElasticSearch 目录的 plugins 目录下新建一个 ik 目录并解压。


可以使用 Postman 测试 IK 分词器:

1.png

请求头的 Content-Type 一定要设置为 application/json 否则无法请求成功。


配置

在 .ENV 增加配置:

SCOUT_DRIVER=elasticsearch

在 config/scout.php 增加配置:

'elasticsearch' => [
    'hosts' => [
        env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
    ],
]

模型使用

文档:https://learnku.com/docs/laravel/6.x/scout/5191

可以在 .ENV 添加参数 SCOUT_QUEUE 并设置为 true

设置之后不要忘了执行队列,不然无法同步数据到 ElasticSearch。


在模型中引入:

use Laravel\Scout\Searchable;

之后增删改查就会将数据同步到 ElasticSearch 中。


将数据库中的数据导入到 ElasticSearch:

php artisan scout:import "App\Model\Article"

App\Model\Article 要改成要导入数据的模型。


测试

创建一个写入方法(记得在路由也加上):

public function store()
{
    $model_article = new Article();
    $model_article->title = '不败君';
    $model_article->content = 'www.bubaijun.com 不败君使用 ES';
    $model_article->save();
}

执行之后数据库会保存该记录,同时 ElasticSearch 也会有这条记录。


创建一个查询方法(搜索 同样加在路由进行测试):

public function search()
{
    return Article::search('不败君')->get();
}

返回的数据:

[
    {
        "id": 1,
        "title": "不败君",
        "content": "www.bubaijun.com 不败君使用 ES",
        "created_at": "2020-09-25 17:26:37",
        "updated_at": "2020-09-25 17:26:37",
        "deleted_at": null
    }
]

接着更换不同的搜索词,例如:

public function search()
{
    return Article::search('bubaijun')->get();
}

同样返回这段 JSON,说明此时的查询是通过 ElasticSearch 查询的。


可视化

可以使用可视化工具:kibana 这样管理索引之类的会比较方便。

下载地址:https://www.elastic.co/cn/downloads/kibana


查看索引的信息可以直接访问:http://127.0.0.1:9200/_cat/indices?v (更多接口可以看官方文档)


博主使用的 Laravel 版本是 7+ 且每个包都是使用最新的,在其他版本使用 ElasticSearch 可能会有点区别。

用搜索引擎(百度 / 谷歌)搜索 Laravel 使用 ElasticSearch 基本上都是 Laravel 5 需要添加 Service Provider 的。

博主本文编写的时候没创建索引,直接用模型导入数据到 ElasticSearch ,这样会自动以表名作为索引名创建索引。

本文地址 : bubaijun.com/page.php?id=208

版权声明 : 未经允许禁止转载!

上一篇文章: MySQL的排它锁与共享锁

下一篇文章: SQL查询每科分数最高的

评论:我要评论

沙发

测试直接报这个错误:InvalidArgumentException: Driver [elasticsearch] not supported. in file D:PHPstudy_proWWWlaravelvendorlaravelframeworksrcIlluminateSupportManager.php on line 119

评论时间:2021-07-23 10:31:03

回复

发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语