elasticsearch搜尋商品

luyang發表於2021-07-15

使用Elasticsearch完成商品搜尋

最近開發的專案需要收集商品資訊,顧名思義,又是一個搜尋巨多的活,果斷上ES。

一. 安裝擴充套件

首先,通過 Composer 包管理器來安裝 Scout:

 composer require laravel/scout

這是官方的擴充套件,這個驅動對我們來說不太友好,我需要別的驅動,我選擇 scout-elasticsearch-driver

composer require babenkoivan/scout-elasticsearch-driver

如果您使用的是 Laravel 版本 <= 5.4,請在 config/app.php 中新增以下

'providers' => [
    Laravel\Scout\ScoutServiceProvider::class,
    ScoutElastic\ScoutElasticServiceProvider::class,
]

全部安裝完成後,使用命令來生成 Scout 配置檔案。這個命令將在你的 config 目錄下生成 scout.php 以及scout_elastic.php 配置檔案。

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
php artisan vendor:publish --provider="ScoutElastic\ScoutElasticServiceProvider"

二. es配置

.env 檔案新增

// 驅動的host資訊,如果有賬號密碼:http://elastic_user:password@127.0.0.1:9200
SCOUT_ELASTIC_HOST=elasticsearch:9200
// 驅動
SCOUT_DRIVER=elastic
// 是否開啟佇列,預設不需要配置,建議開啟
SCOUT_QUEUE=true

三. 索引配置

索引配置器用於為 Elasticsearch 設定索引。這裡我需要一個商品的索引,請使用以下 artisan 命令:

php artisan elastic:create-index  "App\Elasticsearch\IndexConfigurators\ProductIndexConfigurator"

執行成功後需要配置商品的索引

<?php

namespace App\Elasticsearch\IndexConfigurators;

use ScoutElastic\IndexConfigurator;
use ScoutElastic\Migratable;

class ProductIndexConfigurator extends IndexConfigurator
{
    use Migratable;

    protected $name = 'product_index';

    // You can specify any settings you want, for example, analyzers.
    protected $settings = [
        'number_of_shards' => 5,
        'number_of_replicas' => 0,
        'max_result_window' => 100000000
    ];

    protected $defaultMapping = [
        'properties' => [
            'id' => [
                'type' => 'integer',
            ],
            'title' => [
                'type' => 'text',
                'analyzer' => 'ik_max_word',
                'search_analyzer' => 'ik_smart',
            ],
            'desc' => [
                'type' => 'text',
                'analyzer' => 'ik_max_word',
                'search_analyzer' => 'ik_smart'
            ],
            'created_at' => [
                'type' => 'date',
                'format' => 'yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis'
            ]
        ],
    ];
}

我就簡單的配置了一點,上面我用到中文分詞,這裡就不闡述怎麼安裝ik了,具體的根據自己的欄位來選擇合適的型別。然後在商品的模型:

<?php
namespace App\Models;

use App\Elasticsearch\IndexConfigurators\ProductIndexConfigurator;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use ScoutElastic\Searchable;

class Product extends Model
{
    use HasFactory,
        Searchable;

    protected $indexConfigurator = ProductIndexConfigurator::class;

    public function toSearchableArray() {
      return [
         'id' => $this->id,
         'title' => $this->title,
         'desc' => $this->desc,
         'created_at' => $this->created_at
      ]
    }

}

在模型中設定對映後,可以更新 Elasticsearch 型別對映,也就是把我們剛才建立的索引和商品的模型繫結在一起。

 php artisan elastic:update-mapping "App\Models\Product"

你也可以把資料庫的資料匯入到Elasticsearch中,具體的使用方法還是去看看這兩個擴充套件的詳細文件。

php artisan scout:import "App\Models\Product"

到這裡基本都成了,嘿嘿。

四. 搜尋使用

這個擴充套件的好處就是基本上的搜尋還是和LaravelORM一致,會少一點,具體的還是自己去看文件

        Product::search('phone')
            // specify columns to select
            ->select(['title', 'price'])
            // filter 
            ->where('color', 'red')
            // sort
            ->orderBy('price', 'asc')
            // collapse by field
            ->collapse('brand')
            // set offset
            ->from(0)
            // set limit
            ->take(10)
            // get results
            ->get();

結語

感謝一下擴充套件的優秀作者,才能讓我們好好偷懶,感謝!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章