Builder для запроса ElasticSearch DSL в Yii2 (или автономно)

Насколько я вижу, единственный способ сделать запрос к ElasticSearch в Yii2 — это запустить ElasticModel::find()->query($query), где $query является сложным массивом, содержащим фактический запрос, записанный в DSL-запросе ElasticSearch.

Запрос огромен и быстро становится неуправляемым. Для SQL Yii2 предоставляет мощный класс построителя запросов, который поддерживает множество полезных методов, таких как andWhere(), Для ElasticSearch все сводится к одному гигантскому выражению запроса, очень похоже на создание строки выражения SQL вручную.

Существует ли высокоуровневая оболочка для DSL-запроса ElasticSearch для Yii2? Если нет, то есть ли отдельная библиотека с подобным функционалом?

1

Решение

Если вы собираетесь собирать версию 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, который может быть полезен для вас. Посмотрите на это Вот.

Надеюсь, это поможет вам …

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]