Насколько я вижу, единственный способ сделать запрос к ElasticSearch в Yii2 — это запустить ElasticModel::find()->query($query)
, где $query
является сложным массивом, содержащим фактический запрос, записанный в DSL-запросе ElasticSearch.
Запрос огромен и быстро становится неуправляемым. Для SQL Yii2 предоставляет мощный класс построителя запросов, который поддерживает множество полезных методов, таких как andWhere()
, Для ElasticSearch все сводится к одному гигантскому выражению запроса, очень похоже на создание строки выражения SQL вручную.
Существует ли высокоуровневая оболочка для DSL-запроса ElasticSearch для Yii2? Если нет, то есть ли отдельная библиотека с подобным функционалом?
Если вы собираетесь собирать версию 1.6 из эластичного пакета, я создал конструктор запросов для своей компании и опубликовал это здесь
Вы будете использовать его как автономный построитель запросов, и в конце вам понадобится получить окончательный массив запросов и передать его исполнителю запросов.
Чтобы установить его, вы можете просто использовать композитор composer require itvisionsy/php-es-orm
или скачайте архивную версию Вот.
Ссылка выше содержит несколько примеров, а вот копия:
//build the query using different methods
$query = \ItvisionSy\EsMapper\QueryBuilder::make()
->where('key1','some value') //term clause
->where('key2',$intValue,'>') //range clause
->where('key3','value','!=') //must_not term clause
->where('key4', ['value1','value2']) //terms clause
->where('email', '@hotmail.com', '*=') //wildcard search for all @hotmail.com emails
->sort('key1','asc') //first sort option
->sort('key2',['order'=>'asc','mode'=>'avg']) //second sort option
->from(20)->size(20) //results from 20 to 39
->toArray();
//modify the query as you need
$query['aggs']=['company'=>['terms'=>['field'=>'company']]];
//then execute it against a type query
$result = TypeQuery::query($query);
//i am not sure about Yii way to execute, according to the question, it should be:
$result = ElasticModel::find()->query($query);
В пакет также входит простой класс ElasticSearch ORM, который может быть полезен для вас. Посмотрите на это Вот.
Надеюсь, это поможет вам …
Других решений пока нет …