Laradock 安装 Elasticsearch

运行 elasticsearch 容器#

使用 CLI 进入 laradock 目录并执行:

Copy Highlighter-hljs
docker-compose up -d elasticsearch

使用 docker-compose ps 检查容器状态

使用 docker stats 检查容器使用的资源

Copy Highlighter-hljs
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS e4ff663e300c laradock_elasticsearch_1 0.34% 783.6MiB / 3.846GiB 19.90% 2.15kB / 0B 241MB / 422kB 55 33f5234ad041 laradock_php-fpm_1 0.00% 9.578MiB / 3.846GiB 0.24% 1.01kB / 0B 13.1MB / 0B 3 2d14b2b770aa laradock_workspace_1 0.00% 8.832MiB / 3.846GiB 0.22% 2.81kB / 0B 778kB / 57.3kB 6 94caba28a367 laradock_docker-in-docker_1 0.37% 20.11MiB / 3.846GiB 0.51% 1.8kB / 0B 22.2MB / 1.01MB 22

我在我的 Docker 桌面 (Windows) 中为基于 linux 的虚拟机分配了 4GB 内存。 Elasticsearch 占用了 3.84GB 可用内存的 20%。这个容器占用了大量的资源,想象一下,如果你也运行 kibanalogstash,它们具有相同的占比,那么占用的总资源将是 60%。因此,请考虑将来在你的机器或生产服务器上的分配。

访问 Elasticsearch#

如果您从外部 laradock 环境 (如 postman 桌面应用程序或配置在 laradock 外部的任何 PHP 应用程序) 访问服务 (例如使用 phpstudy的 PHP 应用程序),完整地址为 http://localhost:9200

如果你在 laradock 环境中访问服务,例如在 workspace 容器中使用 curl,完整的地址是 elasticsearch:9200。下面是在工作空间容器中使用 curl 的结果:

Copy Highlighter-hljs
laradock@2d14b2b770aa:/var/www$ curl elasticsearch:9200 { "name" : "laradock-node", "cluster_name" : "laradock-cluster", "cluster_uuid" : "3juGQWtJTa2L7yYBKnfh-g", "version" : { "number" : "7.5.1", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96", "build_date" : "2019-12-16T22:57:37.835892Z", "build_snapshot" : false, "lucene_version" : "8.3.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" } laradock@2d14b2b770aa:/var/www$

Laravel中使用Elasticsearch#

我将找到封装了 elasticsearch 和 laravel 的可用包,并在这里做了演示。


在 laradock 中体验 elasticsearch 的乐趣吧!

Copy Highlighter-hljs
versions used: - laradock ELK_VERSION=7.5.1 - Postman Desktop: Postman v7.21.1

引入Composer包#

Elasticsearch 官方提供了 Composer 包,在引入时需要注意要指定版本,因为不同版本的 Elasticsearch 的 API 略有不同,我们用的是 6.x,因此需使用 ~6.0 来指定包版本。

Copy Highlighter-hljs
~ composer require elasticsearch/elasticsearch '~6.0'

配置#

Elasticsearch 的配置很简单,我们只需要 Elasticsearch 服务器的 IP 和端口即可:

config/database.php

Copy Highlighter-hljs
'elasticsearch' => [ // Elasticsearch 支持多台服务器负载均衡,因此这里是一个数组 'hosts' => explode(',', env('ES_HOSTS')), ]

我们本地环境的 ElasticsearchIP 和端口是 localhost:9200,如果端口是 9200 则可以忽略不写:

.env

Copy Highlighter-hljs
ES_HOSTS=elasticsearch

为了保证其他的开发人员知道需要在 .env 文件中配置 ES_HOSTS,因此还需要修改一下 .env.example 文件:

Copy Highlighter-hljs
ES_HOSTS=

初始化 Elasticsearch 对象#

初始化 Elasticsearch 对象,并注入到 Laravel 容器中:

app/Providers/AppServiceProvider.php

Copy Highlighter-hljs
use Elasticsearch\ClientBuilder as ESClientBuilder; . . . public function register() { . . . // 注册一个名为 es 的单例 $this->app->singleton('es', function () { // 从配置文件读取 Elasticsearch 服务器列表 $builder = ESClientBuilder::create()->setHosts(config('database.elasticsearch.hosts')); // 如果是开发环境 if (app()->environment() === 'local') { // 配置日志,Elasticsearch 的请求和返回数据将打印到日志文件中,方便我们调试 $builder->setLogger(app('log')->driver()); } return $builder->build(); }); } . . .

测试#

接下来我们来测试一下能否正常工作,首先进入 tinker:

Copy Highlighter-hljs
~ php artisan tinker

然后输入:

Copy Highlighter-hljs
>>> app('es')->info() => [ "name" => "4Pg3tus", "cluster_name" => "laradock-cluster", "cluster_uuid" => "gBNZeDnYTkGpQRRxpmiFIw", "version" => [ "number" => "6.6.0", "build_flavor" => "default", "build_type" => "tar", "build_hash" => "a9861f4", "build_date" => "2019-01-24T11:27:09.439740Z", "build_snapshot" => false, "lucene_version" => "7.6.0", "minimum_wire_compatibility_version" => "5.6.0", "minimum_index_compatibility_version" => "5.0.0", ], "tagline" => "You Know, for Search", ]

可以看到返回正常,接下来我们看看日志里有没有对应的请求和响应:

Copy Highlighter-hljs
~ less storage/logs/laravel-{当前日期}.log

然后按 shift + g 跳转到末尾,可以看到相应的请求和返回日志。

接下来我们试试用 PHP 来读取之前创建的 Elasticsearch 文档:

Copy Highlighter-hljs
>>> app('es')->get(['index' => 'test_index', 'type' => '_doc', 'id' => 1]) => [ "_index" => "test_index", "_type" => "_doc", "_id" => "1", "_version" => 1, "_seq_no" => 0, "_primary_term" => 2, "found" => true, "_source" => [ "title" => "iPhone X", "description" => "新品到货", "price" => 8848, ], ]
  • get() 表示读取文档;
  • index 表示读取的索引名称;
  • type 表示要读的类型;
  • id 则是指定要读取的文档 ID。
posted @   caibaotimes  阅读(426)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
CONTENTS