Magento 2: Programmatically search product using advanced search engine

Quick little snippet for reusing the Magento 2 advanced search programmatically.

The gist of functionality lies on injecting and using \Magento\Eav\Model\Config $eavConfig and \Magento\CatalogSearch\Model\Advanced $catalogSearchAdvanced, as shown in the following example.


namespace Foggyline\Search\Controller\Search;

class Test extends \Foggyline\Search\Controller\Search
    private $eavConfig;
    protected $catalogSearchAdvanced;

    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Eav\Model\Config $eavConfig,
        \Magento\CatalogSearch\Model\Advanced $catalogSearchAdvanced
        $this->eavConfig = $eavConfig;
        $this->catalogSearchAdvanced = $catalogSearchAdvanced;

    public function execute()
        $queryValue = [];

        // Assuming we are searching for existing "Rose Gold" labeled color
        $queryValue['color'][] = $this->eavConfig
            ->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'color')
            ->getOptionId('Rose Gold');

        // Assuming we are searching for "XL" labeled size
        $queryValue['size'][] = $this->eavConfig
            ->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'size')

        $products = $this->catalogSearchAdvanced

        foreach ($products as $product) {
            // var_dump($product->getName());

The $queryValue has a certain structure. We could easily temporarily edit the vendor\magento\module-catalog-search\Controller\Advanced\Result.php file by placing the var_dump on the $this->getRequest()->getQueryValue() expression when submitting the Advanced Search form from storefront page on /catalogsearch/advanced/  URL in order to observe that structure.