2016-09-17 22 views

cevap

1

Laravel Scout, gelişmiş Elasticsearch özelliklerini desteklemiyor. Endeks oluşturma ve güncellemenin tamamı için model olaylarına dayalı olarak Scout ile uğraştım, ancak ElasticSearch kütüphanesini doğrudan kullanmak için aramamı değiştirdim.

3

Aslında özel Scout Engine ile yapılabilir.

<?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); 
    } 
} 

yeni ElasticqueryEngine kayıt yeni servis sağlayıcı ekleyin (veya mevcut servis sağlayıcıların herhangi bunu yapmak):

en Örneğin ElasticqueryEngine diyelim ve varsayılan ElasticsearchEngine onu uzatmak

<?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 yeni servis sağlayıcı eklemeyi unutmayın:

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

Ve, https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html gelen herhangi bir sorgu ile arama yapabilirsiniz Sonuçta config/scout.php veya .env (SCOUT_DRIVER = elasticquery)

yılında "elasticquery" için sürücüyü değiştirin:

Bu çözümü gibi
$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(); 
+0

, ama şimdilik, ElasticSearch'ü doğrudan ES PHP SDK'sı üzerinden sorguluyordum. – ATLChris

İlgili konular