私はLaravel ScoutとElasticsearchとの検索統合を構築しています。私はどのように私がブースティングのための私のクエリを洗練することができるかを理解しようとしています。Laravel ScoutとElasticSearchでどのようにブーストとフィルターを設定できますか?
Laravel Scoutでこれを行うことは可能ですか、それともElasticSearch PHPライブラリを直接使用することに戻す必要がありますか?
私はLaravel ScoutとElasticsearchとの検索統合を構築しています。私はどのように私がブースティングのための私のクエリを洗練することができるかを理解しようとしています。Laravel ScoutとElasticSearchでどのようにブーストとフィルターを設定できますか?
Laravel Scoutでこれを行うことは可能ですか、それともElasticSearch PHPライブラリを直接使用することに戻す必要がありますか?
Laravel Scoutは、高度な弾性検索機能をサポートしていません。 Scoutをモデル作成イベントに基づいてすべてのインデックス作成と更新のために拘束しましたが、私はElasticSearchライブラリを直接利用するために検索を切り替えました。
実際には、カスタムのScout Engineを使って簡単に行うことができます。
<?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を登録するには、新しいサービスプロバイダを追加(または既存のサービス・プロバイダのいずれかでそれを行う):
のは、例えば、ElasticqueryEngineそれを呼ぶことにしましょう、とデフォルトのElasticsearchEngineから、それを拡張
<?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,
],
と設定/ scout.phpまたは.envに "elasticquery" にドライバを変更(SCOUT_DRIVER = 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に問い合わせています。 – ATLChris