【问题标题】:How can you set boosts and filters with Laravel Scout and ElasticSearch?如何使用 Laravel Scout 和 ElasticSearch 设置提升和过滤器?
【发布时间】:2016-10-02 06:09:57
【问题描述】:

我正在构建与 Laravel Scout 和 Elasticsearch 的搜索集成。我正在尝试弄清楚如何优化查询以进行提升。

是否可以使用 Laravel Scout 执行此操作,或者我是否需要恢复直接使用 ElasticSearch PHP 库?

【问题讨论】:

    标签: laravel elasticsearch


    【解决方案1】:

    其实用自定义的 Scout Engine 就可以轻松完成。

    例如,我们称它为 ElasticqueryEngine,并从默认的 ElasticsearchEngine 扩展它:

    <?php
    
    namespace App\Libs\Scout\Engines;
    
    use Laravel\Scout\Builder;
    use Laravel\Scout\Engines\ElasticsearchEngine;
    
    class ElasticqueryEngine extends ElasticsearchEngine
    {
        /**
         * Perform the given search on the engine.
         *
         * @param  Builder  $query
         * @param  array  $options
         * @return mixed
         */
        protected function performSearch(Builder $query, array $options = [])
        {
            if (!is_array($query->query)) {
                return parent::performSearch($query, $options);
            }
    
            $searchQuery = [
                'index' => $this->index,
                'type' => $query->model->searchableAs(),
                'body' => [
                    'query' => $query->query,
                ],
            ];
    
            if (array_key_exists('size', $options)) {
                $searchQuery = array_merge($searchQuery, [
                    'size' => $options['size'],
                ]);
            }
            if (array_key_exists('from', $options)) {
                $searchQuery = array_merge($searchQuery, [
                    'from' => $options['from'],
                ]);
            }
            return $this->elasticsearch->search($searchQuery);
        }
    }
    

    添加新的服务提供者以注册新的 ElasticqueryEngine(或在任何现有的服务提供者中进行):

    <?php
    
    namespace App\Providers;
    
    use Laravel\Scout\EngineManager;
    use Illuminate\Support\ServiceProvider;
    use Elasticsearch\ClientBuilder as Elasticsearch;
    use App\Libs\Scout\Engines\ElasticqueryEngine;
    
    class ElasticqueryServiceProvider extends ServiceProvider
    {
        /**
         * Perform post-registration booting of services.
         *
         * @return void
         */
        public function boot()
        {
            resolve(EngineManager::class)->extend('elasticquery', function () {
                return new ElasticqueryEngine(
                    Elasticsearch::fromConfig(config('scout.elasticsearch.config')),
                    config('scout.elasticsearch.index')
                );
            });
        }
    
        /**
         * Register bindings in the container.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
    

    不要忘记在 config/app.php 中添加新的服务提供者:

    'providers' => [
        // ...
        Laravel\Scout\ScoutServiceProvider::class,
        App\Providers\ElasticqueryServiceProvider::class,
    ],
    

    并在 config/scout.php 或 .env (SCOUT_DRIVER=elasticquery) 中将驱动程序更改为“elasticquery”

    毕竟,您可以通过来自https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html 的任何查询进行搜索:

    $query = [
        'simple_query_string' => [
            'query' => 'findme',
            'fields' => [
                'title^5',
                'description',
            ],
        ],
    ];
    $posts = Posts::search($query)->get();
    
    // also you can use default ElasticsearchEngine query
    $posts = Posts::search('findme')->where('user_id', 1)->get();
    

    【讨论】:

    • 我喜欢这个解决方案,但目前我只是通过 ES PHP SDK 直接查询 ElasticSearch。
    【解决方案2】:

    Laravel Scout 不支持高级 Elasticsearch 功能。我最终坚持使用 Scout 来根据模型事件创建和更新所有索引,但我切换了搜索以直接使用 ElasticSearch 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-03
      • 2019-04-28
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      相关资源
      最近更新 更多