Elasticsearch. Использование фильтров в поиске (Query DSL)

Elasticsearch обеспечивает богатый, гибкий, язык запросов, называемый DSL (domain-specific language) - запрос, который позволяет строить гораздо более сложные, устойчивые запросы.

Команда:

GET /megacorp/employee/_search {
    "query" : {    
        "filtered" : {
            "filter" : {    
                "range" : {
                    "age" : { "gt" : 20 } 
                }
            },
            "query" : {
                "match" : {
                    "last_name" : "smith"
                }
            }
        }
    }
}
"filter" : {
    "range" : {   - диапазонный фильтр
        "age" : { "gt" : 20 }  - ищем сотрудников по фамилии smith старше 20 лет (параметр - gt)
    }
}

CURL:

pretty - возвращает данные в формате JSON и отформатированном виде (с пробелами и табами)

$curl -XPOST 'localhost:9200/megacorp/employee/_search?pretty' -d '
{
    "query" : 
    {
        "filtered" : 
        {
            "filter" : 
            {
                "range" : 
                {
                    "age" : { "gt" : 20 } 
                }
            },
        "query" : 
        {
            "match" : {"last_name" : "smith"}
        }
      }
   }
}'

PHP:

require 'vendor/autoload.php';
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
            'index' => 'megacorp',
            'type'  => 'employee',
            'body'  => [
                'query' => [
                    'filtered' => [
                        'filter' => [
                            'range' => [
                                'age' => [ 
                                   'gt'=> 20
                                ]
                            ]
                        ],
                        'query'  => [ 
                           'match' => [
                                'last_name' => 'smith'
                            ]
                        ],
                    ],
                ]
            ]
        ];
try {
    $response = $client->search($params);
} catch (Exception $e) {
    var_dump($e->getMessage());        
}
print_r($response);

Yii2:

$params = [
    'filtered' => [
        'filter' => [
            'range' => [
                'age' => [
                    'gt'=> 20
                ]
            ]
        ],
        'query'  => [
            'match' => [
                'last_name' => 'smith'
            ]
         ],
       ],
];
$model = Megacorp::find()->query($params)->all();
var_dump($model);

Дополнительно

Предыдущая часть: Elasticsearch. Извлечение данных