Rumah > rangka kerja php > Laravel > teks badan

Ajar anda cara menggunakan elasticsearch dalam laravel (langkah yang jelas)

藏色散人
Lepaskan: 2021-10-22 09:19:42
ke hadapan
2455 orang telah melayarinya

Lajur tutorial Laravel berikut akan memperkenalkan cara menggunakan elasticsearch dalam laravel (langkah yang jelas saya harap ia akan membantu anda!

Pasang pakej sambungan yang berkaitan

  • guzzlehttp/guzzle
  • elasticsearch/elasticsearch
  • laravel /scout
  • babenkoivan/scout-elasticsearch-driver
  • predis/predis Sejumlah besar data memerlukan penyegerakan baris gilir dan pemasangan apabila menarik data

1. Pasang guzzlehttp/guzzle

composer require guzzlehttp/guzzle
Salin selepas log masuk

Tulis kelas perkhidmatan Http dalam direktori apl/Perkhidmatan

<?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();
    }}
Salin selepas log masuk

2 . Pasang elasticsearch/elasticsearch

composer require elasticsearch/elasticsearch
Salin selepas log masuk

3 Pasang laravel/scout

composer require laravel/scout

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Salin selepas log masuk

4 /scout-elasticsearch-driver

composer require babenkoivan/scout-elasticsearch-driver

php artisan vendor:publish --provider="ScoutElastic\ScoutElasticServiceProvider"
Salin selepas log masuk

konfigurasi perkhidmatan pengakap, tambah item konfigurasi dalam env

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

Pasang predis/predis

composer require predis/predis
Salin selepas log masuk

Mulakan Templat anjal

  • Di sini, arahan artisan digunakan untuk mengkonfigurasi fail arahan yang dijana

    php artisan make:command EsInit
    Salin selepas log masuk
    <?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');
      }}
    Salin selepas log masuk

    Jana model dapatkan semula

    php artisan make:model Models/Article
    Salin selepas log masuk

Buat fail konfigurasi indeks model

  • ElasticsearchArticleIndexConfigurator. php
    <?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_'
                  ]
              ]
          ]
      ];}
    Salin selepas log masuk

Buat fail peraturan carian model

  • ElasticsearchSearchRulesArticleRule.php

    <?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,
                  ],
              ],
          ];
      }}
    Salin selepas log masuk

Tetapkan medan Pemetaan model dan dapatkan semula

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,
        ];
    }}
Salin selepas log masuk

Gunakan langkah

  • untuk menjana Templat anjal serupa dengan struktur jadual mysql

    php artisan es:init
    Salin selepas log masuk
  • Kemas kini pemetaan jenis elastik

    php artisan elastic:update-mapping "App\Models\Article"
    Salin selepas log masuk
  • Import data pangkalan data ke dalam elastik

    php artisan scout:import "App\Models\Article"
    Salin selepas log masuk
  • PS: Arahan lain

  • Kosongkan data elastik

    php artisan scout:flush "App\Models\Article"
    Salin selepas log masuk

Gunakan cari

 $query = Article::search('二胡')
            ->paginateRaw(3,'article',1);
        dd($query->items()['hits']);
Salin selepas log masuk

Sila semak dokumentasi untuk kegunaan lain

Atas ialah kandungan terperinci Ajar anda cara menggunakan elasticsearch dalam laravel (langkah yang jelas). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!