Magento 2 二次开发:关于框架搜索服务功能的介绍与分析

7天成为Magento系统架构师,现在开始学习Magento全栈开发!

《Magento2.X企业级开发实战》

搜索在 magento 2 中使用 3 个请求名称:

‘quick_search_container’ 当您从顶部的小字段文本进行搜索时。

‘advanced_search_container’ 当您使用高级搜索页面时。

‘catalog_view_container’ 当您进入类别页面或在类别页面中使用过滤器时,它默认工作。

在类 Magento\Framework\Search\Search 中,函数 search(SearchCriteriaInterface $searchCriteria) 使用类 Magento\Framework\Search\Request\Builder 构建请求; 它首先将查询名称放入对象 $this->requestBuilder(例如“quick_search_container”)

在推入范围之后,它会使用 Magento\Framework\App\ScopeResolverInterface 类的 $this->scopeResolver 实例获取当前范围,您可以在表单(从哪里开始搜索(’当前页面’)和页面大小),然后 它使用 Magento\Framework\Search\SearchEngineInterface 的 $searchEngine 实例来获取搜索示例 solr 或 mysql 的当前或资源:

$searchResponse = $this->searchEngine->search($request);

之后它使用:

$this->searchResponseBuilder 实例 Magento\Framework\Search\SearchResponseBuilder

return $this->searchResponseBuilder->build($searchResponse)->setSearchCriteria($searchCriteria);

完整的功能是:

public function search(SearchCriteriaInterface $searchCriteria)
    {
        $this->requestBuilder->setRequestName($searchCriteria->getRequestName());
        $scope = $this->scopeResolver->getScope()->getId();
        $this->requestBuilder->bindDimension('scope', $scope);
        foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
            foreach ($filterGroup->getFilters() as $filter) {
                $this->addFieldToFilter($filter->getField(), $filter->getValue());
            }
        }
        $this->requestBuilder->setFrom($searchCriteria->getCurrentPage() * $searchCriteria->getPageSize());
        $this->requestBuilder->setSize($searchCriteria->getPageSize());
        $request = $this->requestBuilder->create();
        $searchResponse = $this->searchEngine->search($request);
        return $this->searchResponseBuilder->build($searchResponse)->setSearchCriteria($searchCriteria);
    }

不要忘记该功能也可以使用以下方式管理过滤器:

 private function addFieldToFilter($field, $condition = null)
    {
        if (!is_array($condition) || !in_array(key($condition), ['from', 'to'], true)) {
            $this->requestBuilder->bind($field, $condition);
        } else {
            if (!empty($condition['from'])) {
                $this->requestBuilder->bind("{$field}.from", $condition['from']);
            }
            if (!empty($condition['to'])) {
                $this->requestBuilder->bind("{$field}.to", $condition['to']);
            }
        }
        return $this;
    }

用于分析表单并添加一些条件字段过滤器,如价格或日期,
目录在哪里使用此功能:

供应商/magento/module-catalog-search/Model/ResourceModel/Fulltext/Collection.php
供应商/magento/module-catalog-search/Model/ResourceModel/Advanced/Collection.php

在受保护的函数 _renderFiltersBefore()

比较聚合的 2 个结果:

具有 1 个产品结果的类别视图容器:

object(Magento\Framework\Search\Response\Aggregation)#1760 (1) { ["buckets":protected]=> array(4) { ["price_bucket"]=> object(Magento\Framework\Search\Response\Bucket)#1674 (2) { ["name":protected]=> string(12) "price_bucket" ["values":protected]=> array(1) { [0]=> object(Magento\Framework\Search\Response\Aggregation\Value)#1163 (2) { ["value":"Magento\Framework\Search\Response\Aggregation\Value":private]=> string(4) "10_*" ["metrics":"Magento\Framework\Search\Response\Aggregation\Value":private]=> array(2) { ["value"]=> string(4) "10_*" ["count"]=> string(1) "1" } } } } ["category_bucket"]=> object(Magento\Framework\Search\Response\Bucket)#1132 (2) { ["name":protected]=> string(15) "category_bucket" ["values":protected]=> array(0) { } } ["color_bucket"]=> object(Magento\Framework\Search\Response\Bucket)#1798 (2) { ["name":protected]=> string(12) "color_bucket" ["values":protected]=> array(0) { } } ["manufacturer_bucket"]=> object(Magento\Framework\Search\Response\Bucket)#1133 (2) { ["name":protected]=> string(19) "manufacturer_bucket" ["values":protected]=> array(0) { } } } }

具有 0 个产品结果的类别视图容器:

object(Magento\Framework\Search\Response\Aggregation)#1135 (1) { ["buckets":protected]=> array(4) { ["price_bucket"]=> object(Magento\Framework\Search\Response\Bucket)#1142 (2) { ["name":protected]=> string(12) "price_bucket" ["values":protected]=> array(0) { } } ["category_bucket"]=> object(Magento\Framework\Search\Response\Bucket)#1986 (2) { ["name":protected]=> string(15) "category_bucket" ["values":protected]=> array(0) { } } ["color_bucket"]=> object(Magento\Framework\Search\Response\Bucket)#1144 (2) { ["name":protected]=> string(12) "color_bucket" ["values":protected]=> array(0) { } } ["manufacturer_bucket"]=> object(Magento\Framework\Search\Response\Bucket)#2019 (2) { ["name":protected]=> string(19) "manufacturer_bucket" ["values":protected]=> array(0) { } } } }

比较 Documents 的 2 个结果:

具有 1 个产品结果的类别视图容器:

array(1) { [0]=> object(Magento\Framework\Api\Search\Document)#1986 (1) { ["_data":protected]=> array(2) { ["id"]=> string(1) "1" ["custom_attributes"]=> array(1) { ["score"]=> object(Magento\Framework\Api\AttributeValue)#1161 (1) { ["_data":protected]=> array(2) { ["attribute_code"]=> string(5) "score" ["value"]=> string(18) "0.0000000000000000" } } } } } }

category view container with 0 product result :

array(0) { }

Document是什么?

大多数应用程序中的大多数实体或对象都可以序列化为带有键和值的 JSON 对象。 键是字段或属性的名称,值可以是字符串、数字、布尔值、另一个对象、值数组或其他一些特殊类型,例如表示日期的字符串或表示日期的对象 地理位置:

Buckets是什么

存储桶只是满足特定条件的文档集合:

一名员工将降落在男性或女性桶中。

奥尔巴尼市将落入纽约州的水桶中。

日期 2014-10-28 将落在十月桶内。

执行聚合时,会评估每个文档中的值以确定它们是否符合存储桶的标准。如果它们匹配,则将文档放置在存储桶中并继续聚合。

存储桶也可以嵌套在其他存储桶中,为您提供层次结构或条件分区方案。例如,辛辛那提将被放置在俄亥俄州桶内,而整个俄亥俄州桶将被放置在美国国家桶内。

Elasticsearch 有多种存储桶,允许您以多种方式(按小时、按最流行的术语、按年龄范围、按地理位置等)对文档进行分区。但从根本上说,它们都遵循相同的原则:根据标准对文档进行分区。

聚合

一种基于多桶值源的聚合,其中桶是动态构建的 – 每个唯一值一个。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

如无特殊说明或标注,任何个人或组织,复制、转载、采集本站内容请注明:
本文来源于:【Magento中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。