前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >laravel 以服务提供者的方式使用 elasticsearch

laravel 以服务提供者的方式使用 elasticsearch

作者头像
崔哥
发布2023-04-12 13:24:31
发布2023-04-12 13:24:31
69200
代码可运行
举报
文章被收录于专栏:崔哥的专栏崔哥的专栏
运行总次数:0
代码可运行

安装

安装elasticsearch官方扩展包

代码语言:javascript
代码运行次数:0
复制
composer require elasticsearch/elasticsearch

以服务提供者的方式使用 elasticsearch

可以参考这篇文章:Laravel 以服务提供者的方式使用第三方扩展包

下面给出关键配置

config/es.php

代码语言:javascript
代码运行次数:0
复制
<?php
declare(strict_types=1);

return [
    'hosts' => explode(',', env('ELASTIC_HOSTS')),//['http://elasticsearch:9200']
    'username'  => env('ELASTIC_USERNAME', ''),
    'password'  => env('ELASTIC_PASSWORD', ''),
    'prefix'  => env('ELASTIC_PREFIX'),
];

Providers/ElasticsearchServiceProvider.php

代码语言:javascript
代码运行次数:0
复制
<?php

namespace App\Providers;

use Elasticsearch\ClientBuilder;
use Illuminate\Support\ServiceProvider;

class ElasticsearchServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(ClientBuilder::class, function ($app) {
            $conf = config('es');
            $client = ClientBuilder::create()->setHosts($conf['hosts']);
            if ($conf['username']) $client->setBasicAuthentication($conf['username'], $conf['password']);
            return $client->build();
        });

        $this->app->alias(ClientBuilder::class, 'es');
    }
}

使用

代码语言:javascript
代码运行次数:0
复制
    $this->prefix = config('es.prefix');
    $this->initArticleIndex();

    /**
     * 创建索引
     */
    protected function initArticleIndex()
    {
        $this->setMapping();

        app('es')->indices()
            ->create([
                'index' => $this->prefix . 'article_index',
                'body'  => [
                    'settings' => [
                        'number_of_shards'   => 2,
                        'number_of_replicas' => 1,
                        'max_result_window'  => 100000
                    ],
                    'mappings' => [
                        'properties' => $this->mapping
                    ]
                ]
            ]);

        app('es')->indices()
            ->putAlias([
                'index' => $this->prefix . 'article_index',
                'name'  => $this->prefix . 'article'
            ]);
    }

    /**
     * 设置字段
     * @throws \Common\Types\Exception
     */
    protected function setMapping()
    {
        $fields = Article::getFields();
        foreach ($fields as $key => $value) {
            if ( ! in_array($value, ['keyword', 'text', 'long', 'integer', 'byte', 'date', 'float', 'double'])) {
                throw new Exception('类型不存在');
            }
            $this->mapping[$key] = ['type' => $value];
        }
    }

参考

参考文档包含一个完整的商品同步,搜索的示例,非常不错

https://blog.csdn.net/weixin_41753567/article/details/125605497

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
    • 以服务提供者的方式使用 elasticsearch
  • 使用
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档