Heim  >  Artikel  >  PHP-Framework  >  Bringen Sie Ihnen bei, wie Sie Elasticsearch in Laravel verwenden (klare Schritte)

Bringen Sie Ihnen bei, wie Sie Elasticsearch in Laravel verwenden (klare Schritte)

藏色散人
藏色散人nach vorne
2021-10-15 15:24:562463Durchsuche

Die folgende Tutorial-Kolumne von Laravel stellt vor, wie man Elasticsearch in Laravel verwendet (die Schritte sind klar, dass es für alle hilfreich sein wird).

Installieren Sie relevante Erweiterungspakete Synchronisation , Ziehen Sie bei der Installation von Daten

  • 1. Installieren Sie guzzlehttp/guzzle
composer require guzzlehttp/guzzle
  • Schreiben Sie die HTTP-Dienstklasse in das App-/Dienstverzeichnis
  • 2. Installieren Sie elasticsearch/elasticsearch
    <?php
    
    namespace App\Services;use GuzzleHttp\Client;use GuzzleHttp\Cookie\CookieJar;class HttpService{
    
        protected $client;
    
        public function __construct()
        {
            $this->client = new Client(['verify' => false, 'timeout' => 0,]);
        }
    
        /**
         * 发送 get 请求
         * @param $url
         * @param array $aQueryParam
         * @param string $isDecode
         * [@return](https://learnku.com/users/31554) mixed
         * @throws \GuzzleHttp\Exception\GuzzleException
         */
        public function get($url, $aQueryParam = [], $isDecode = true)
        {
            $response = $this->client->request('GET',
                $url,
                [
                    'query' => $aQueryParam            ]);
            if($isDecode){
                return \GuzzleHttp\json_decode($response->getbody()->getContents(), true);
            }
            return $response->getbody()->getContents();
        }
    
        /**
         *  发送 post 请求
         * @param $url
         * @param array $aParam
         * @param string $type
         * @param string $isDecode
         * [@return](https://learnku.com/users/31554) mixed
         * @throws \GuzzleHttp\Exception\GuzzleException
         */
        public function post($url, $aParam = [], $type = 'form_params', $isDecode = true)
        {
            $aOptions = [];
            // Sending application/x-www-form-urlencoded POST
            if ($type == 'form_params') {
                $aOptions['form_params'] = $aParam;
            }
            //  upload JSON data
            if ($type == 'json') {
                $aOptions['json'] = $aParam;
            }
            $response = $this->client->request('POST', $url, $aOptions);
    
            if($isDecode){
                return \GuzzleHttp\json_decode($response->getbody()->getContents(), true);
            }
            return $response->getbody()->getContents();
        }
    
        /**
         *  发送 put 请求
         * @param $url
         * @param array $aParam
         * @param string $type
         * @param string $isDecode
         * [@return](https://learnku.com/users/31554) mixed
         * @throws \GuzzleHttp\Exception\GuzzleException
         */
        public function put($url, $aParam = [], $type = 'form_params', $isDecode = true)
        {
            $aOptions = [];
            // Sending application/x-www-form-urlencoded POST
            if ($type == 'form_params') {
                $aOptions['form_params'] = $aParam;
            }
            //  upload JSON data
            if ($type == 'json') {
                $aOptions['json'] = $aParam;
            }
            $response = $this->client->request('PUT', $url, $aOptions);
    
            if($isDecode){
                return \GuzzleHttp\json_decode($response->getbody()->getContents(), true);
            }
            return $response->getbody()->getContents();
        }
    
        /**
         * 保存远程文件到本地
         * 跟随第三方服务器url重定向
         * @param $url
         * [@return](https://learnku.com/users/31554) bool|string
         */
        public function getRemoteFile($url)
        {
            $jar = new CookieJar();
            $aOptions = ['cookies' => $jar];
            $response = $this->client->request('GET', $url, $aOptions);
            return $response->getBody()->getContents();
        }}

    3 . Installieren Sie laravel /scout

    4. Installieren Sie den Scout-Drittanbieter-Treiber babenkoivan/scout-elasticsearch-driver
    composer require elasticsearch/elasticsearch
    Scout-Dienstkonfiguration, fügen Sie Konfigurationselemente in env

    composer require laravel/scout
    
    php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

    hinzu. Installieren Sie predis/predis

    composer require babenkoivan/scout-elasticsearch-driver
    
    php artisan vendor:publish --provider="ScoutElastic\ScoutElasticServiceProvider"

    Initialisieren Sie die elastische Vorlage.

    Konfigurieren Sie die generierte Befehlsdatei mit dem artisan-Befehl.

    // 驱动的host,若需账密:http://es_username:password@127.0.0.1:9200SCOUT_ELASTIC_HOST=elasticsearch:9200// 驱动SCOUT_DRIVER=elastic// 队列配置,数据量大时建议开启SCOUT_QUEUE=true
    composer require predis/predis

    Generieren Sie das Suchmodell

    ElasticsearchArticleIndexConfigurator.php Erstellt von
    php artisan make:command EsInit

    Modellabrufregeldatei
    • ElasticsearchSearchRulesArticleRule.php

      <?php
      namespace App\Console\Commands;use App\Services\HttpService;use Illuminate\Console\Command;class EsInit extends Command{
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = &#39;es:init&#39;;
      
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = &#39;init laravel es for article&#39;;
      
        /**
         * Create a new command instance.
         *
         * [@return](https://learnku.com/users/31554) void
         */
        protected  $http;
        public function __construct()
        {
            parent::__construct();
            parent::__construct();
            $this->http = new HttpService();
        }
      
        /**
         * Execute the console command.
         *
         * [@return](https://learnku.com/users/31554) mixed
         */
        public function handle()
        {
            $this->createTemplate();
        }
        protected function createTemplate()
        {
            $aData = [
                /*
                * 这句是取在scout.php(scout是驱动)里我们配置好elasticsearch引擎的index项。
                * PS:其实都是取数组项,scout本身就是return一个数组,
                * scout.elasticsearch.index就是取
                * scout[elasticsearch][index]
                * */
                'template'=>config('scout.elasticsearch.index'),
                'mappings'=>[
                    'articles' => [
                        'properties' => [
                            'title' => [
                                'type' => 'text'
                            ],
                            'content' => [
                                'type' => 'text'
                            ],
                            'created_at' => [
                                'format' => 'yy-MM-dd HHss',
                                'type' => 'date'
                            ],
                            'updated_at' => [
                                'format' => 'yy-MM-dd HHss',
                                'type' => 'date'
                            ]
                        ]
                    ]
                ],
            ];
            $url = config('scout.elasticsearch.hosts')[0] . '/' . '_template/rtf';
            $this->http->put($url,$aData,'json');
        }}

    Modellzuordnung und -abruffelder festlegen

    php artisan make:model Models/Article

    U Befolgen Sie die Schritte
    , um eine elegante Vorlage ähnlich der MySQL-Tabelle zu erstellen Struktur

    <?php
    namespace App\Elasticsearch;use ScoutElastic\IndexConfigurator;use ScoutElastic\Migratable;class ArticleIndexConfigurator extends IndexConfigurator{
      use Migratable;
      protected $name = &#39;articles&#39;;
      /**
       * @var array
       */
      protected $settings = [
          &#39;analysis&#39; => [
              'analyzer' => [
                  'es_std' => [
                      'type' => 'standard',
                      'stopwords' => '_spanish_'
                  ]
              ]
          ]
      ];}

    Elatic-Typ-Karte aktualisieren
      <?php
      namespace App\Elasticsearch\SearchRules;use ScoutElastic\SearchRule;class ArticleRule extends SearchRule{
        /*
         * @inheritdoc
         */
        public function buildHighlightPayload()
        {
            return [
                &#39;fields&#39; => [
                    'title' => [
                        'type' => 'unified',
                    ],
                    'content' => [
                        'type' => 'unified',
                    ],
                ]
            ];
        }
      
        //进行 match 搜索,会分词
        public function buildQueryPayload()
        {
            $query = $this->builder->query;
            return [
                'must' => [
                    'query_string' => [
                        'query' => $query,
                    ],
                ],
            ];
        }}
    • Datenbankimport elatic
    • class Article extends Model{
          protected $indexConfigurator = ArticleIndexConfigurator::class;
          use Searchable;
      
          /**
           * 检索规则
           * @var string[]
           */
          protected $searchRules = [
              ArticleRule::class
          ];
      
          // 设置模型字段的映射关系
          protected $mapping = [
              'properties' => [
                  'id' => [
                      'type' => 'integer',
                  ],
                  'title' => [
                      'type' => 'text',
                      'analyzer' => 'ik_max_word',
                      'search_analyzer' => 'ik_max_word',
                      'index_options' => 'offsets',
                      'store' => true
                  ],
                  'content' => [
                      'type' => 'text',
                      'analyzer' => 'ik_max_word',
                      'search_analyzer' => 'ik_max_word',
                      'index_options' => 'offsets',
                      'store' => true
                  ],
                  'number' => [
                      'type' => 'integer',
                  ],
              ],
          ];
      
          /**
           * 设置 es 检索返回的字段
           * [@return](https://learnku.com/users/31554) array
           */
          public function toSearchableArray() {
              return [
                  'id' => $this->id,
                  'title' => $this->title,
                  'content' => $this->content,
              ];
          }}

      PS: Andere Befehle

      Elatic-Daten löschen
      php artisan es:init

      • Abruf verwenden
      php artisan elastic:update-mapping "App\Models\Article"
    • Bitte verwenden Sehen Sie sich die Dokumentation selbst an
    • Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen bei, wie Sie Elasticsearch in Laravel verwenden (klare Schritte). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

      Stellungnahme:
      Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen