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%。这个容器占用了大量的资源,想象一下,如果你也运行 kibanalogstash,它们具有相同的占比,那么占用的总资源将是 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')),
]

我们本地环境的 ElasticsearchIP 和端口是 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。
posted @ 2020-12-27 09:50  caibaotimes  阅读(414)  评论(0编辑  收藏  举报