Laradock 安装 Elasticsearch
运行 elasticsearch 容器#
使用 CLI 进入 laradock 目录并执行:
docker-compose up -d elasticsearch
使用 docker-compose ps
检查容器状态
使用 docker stats
检查容器使用的资源
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%。这个容器占用了大量的资源,想象一下,如果你也运行 kibana
和 logstash
,它们具有相同的占比,那么占用的总资源将是 60%。因此,请考虑将来在你的机器或生产服务器上的分配。
访问 Elasticsearch#
如果您从外部 laradock 环境 (如 postman 桌面应用程序或配置在 laradock 外部的任何 PHP 应用程序) 访问服务 (例如使用 phpstudy的 PHP 应用程序),完整地址为 http://localhost:9200 。
如果你在 laradock 环境中访问服务,例如在 workspace
容器中使用 curl
,完整的地址是 elasticsearch:9200
。下面是在工作空间容器中使用 curl 的结果:
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 的乐趣吧!
versions used:
- laradock ELK_VERSION=7.5.1
- Postman Desktop: Postman v7.21.1
引入Composer包#
Elasticsearch 官方提供了 Composer 包,在引入时需要注意要指定版本,因为不同版本的 Elasticsearch 的 API 略有不同,我们用的是 6.x,因此需使用 ~6.0
来指定包版本。
~ composer require elasticsearch/elasticsearch '~6.0'
配置#
Elasticsearch 的配置很简单,我们只需要 Elasticsearch 服务器的 IP 和端口即可:
config/database.php
'elasticsearch' => [
// Elasticsearch 支持多台服务器负载均衡,因此这里是一个数组
'hosts' => explode(',', env('ES_HOSTS')),
]
我们本地环境的 Elasticsearch 的 IP 和端口是 localhost:9200,如果端口是 9200 则可以忽略不写:
.env
ES_HOSTS=elasticsearch
为了保证其他的开发人员知道需要在 .env
文件中配置 ES_HOSTS
,因此还需要修改一下 .env.example
文件:
ES_HOSTS=
初始化 Elasticsearch 对象#
初始化 Elasticsearch 对象,并注入到 Laravel 容器中:
app/Providers/AppServiceProvider.php
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:
~ php artisan tinker
然后输入:
>>> 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",
]
可以看到返回正常,接下来我们看看日志里有没有对应的请求和响应:
~ less storage/logs/laravel-{当前日期}.log
然后按 shift + g
跳转到末尾,可以看到相应的请求和返回日志。
接下来我们试试用 PHP 来读取之前创建的 Elasticsearch 文档:
>>> 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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?