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

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

藏色散人
Freigeben: 2021-10-22 09:19:42
nach vorne
2521 Leute haben es durchsucht

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
Nach dem Login kopieren
  • 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();
        }}
    Nach dem Login kopieren

    3 . Installieren Sie laravel /scout

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

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

    hinzu. Installieren Sie predis/predis

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

    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
    Nach dem Login kopieren
    composer require predis/predis
    Nach dem Login kopieren

    Generieren Sie das Suchmodell

    ElasticsearchArticleIndexConfigurator.php Erstellt von
    php artisan make:command EsInit
    Nach dem Login kopieren

    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');
        }}
      Nach dem Login kopieren

    Modellzuordnung und -abruffelder festlegen

    php artisan make:model Models/Article
    Nach dem Login kopieren

    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_'
                  ]
              ]
          ]
      ];}
    Nach dem Login kopieren

    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,
                    ],
                ],
            ];
        }}
      Nach dem Login kopieren
    • 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,
              ];
          }}
      Nach dem Login kopieren

      PS: Andere Befehle

      Elatic-Daten löschen
      php artisan es:init
      Nach dem Login kopieren

      • Abruf verwenden
      php artisan elastic:update-mapping "App\Models\Article"
      Nach dem Login kopieren
    • 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!

      Verwandte Etiketten:
      Quelle:learnku.com
      Erklärung dieser Website
      Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
      Beliebte Tutorials
      Mehr>
      Neueste Downloads
      Mehr>
      Web-Effekte
      Quellcode der Website
      Website-Materialien
      Frontend-Vorlage