pimcore / personalized-product-search
Requires
- elasticsearch/elasticsearch: ^6 | ^7
Requires (Dev)
- phpstan/phpstan: ^0.12.19
- symfony/phpunit-bridge: ^5.0
This package is auto-updated.
Last update: 2024-09-22 14:30:12 UTC
README
此包通过使用各种个性化标准,如浏览历史、客户的购买历史以及客户分配到客户组的能力,增加了自定义Elasticsearch查询搜索产品的功能。该包以可扩展的方式编写,以便可以轻松实现使用自定义标准添加个性化。此外,该包设计得可以尽可能容易地集成到现有解决方案中。
有关此包架构的详细信息,请参阅相应的架构wiki页面。
提供的功能概述
- 使用各种标准个性化Elasticsearch查询
- 预定义的适配器执行和加权装饰器
EqualWeightDecorator
:每个适配器以相同的权重执行PerformanceMeasurementDecorator
:测量适配器修改查询所需的时间,并将其写入Elasticsearch索引
- 预定义适配器
SegmentAdapter
:根据用户的浏览行为增强查询PurchaseHistoryAdapter
:根据客户的订单历史记录增强查询RelevantProductAdapter
:根据分配给客户组的查询增强
- 以可扩展的方式编写,以便可以轻松添加自定义适配器和装饰器
使用方法
安装包
- 安装电子商务包
- 像安装其他pimcore包一样安装个性化搜索包
定义参数
以下两个参数需要在您的应用程序中定义(已提供默认值,但可能不太合适)
personalized_search_index_prefix
- ETL ES索引名称的前缀(默认设置为personalized_search_
)es_hosts
- ES主机数组(默认设置为['localhost']
)
实现必要的接口
个性化搜索包需要一些应用程序依赖的数据才能工作。因此提供了一些必须实现的接口。此外,这些实现必须可用于依赖注入。
在service.yaml
中必须添加以下条目(请注意,实现可能不同)。
ProductSegmentExtractorInterface
ProductSegmentExtractorInterface
的实现负责从产品中提取段。默认实现始终返回空数组,因此这是一个您需要实现并覆盖的接口。
Pimcore\Bundle\PersonalizedSearchBundle\ExtractTransformLoad\SegmentExtractor\ProductSegmentExtractorInterface: '@AppBundle\Ecommerce\IndexService\SegmentGetter' AppBundle\Personalization\FactoryOrderManagerProvider: ~ Pimcore\Bundle\PersonalizedSearchBundle\ExtractTransformLoad\PersonalizationOrderManagerProvider: '@AppBundle\Personalization\FactoryOrderManagerProvider'
PersonalizationOrderManagerProvider
提供对订单管理器(电子商务包的一部分)以及客户类ID的访问。已提供默认实现,您可能需要覆盖它。
AppBundle\Personalization\FactoryOrderManagerProvider: ~ Pimcore\Bundle\PersonalizedSearchBundle\ExtractTransformLoad\PersonalizationOrderManagerProvider: '@AppBundle\Personalization\FactoryOrderManagerProvider'
namespace AppBundle\Personalization; use Pimcore\Bundle\EcommerceFrameworkBundle\Factory; use Pimcore\Bundle\EcommerceFrameworkBundle\OrderManager\OrderManagerInterface; use Pimcore\Bundle\PersonalizedSearchBundle\ExtractTransformLoad\PersonalizationOrderManagerProvider; use Pimcore\Model\DataObject\Customer; class FactoryOrderManagerProvider implements PersonalizationOrderManagerProvider { function getOrderManager(): OrderManagerInterface { return Factory::getInstance()->getOrderManager(); } function getCustomerClassId(): string { return Customer::classId(); } }
PersonalizationAdapterCustomerIdProvider
用于检索当前登录用户的ID。已提供默认实现,该实现从symfony安全中读取当前登录用户。
以下示例使用电子商务框架提供的功能。
AppBundle\Personalization\FactoryPersonalizationAdapterCustomerIdProvider: ~ Pimcore\Bundle\PersonalizedSearchBundle\Customer\PersonalizationAdapterCustomerIdProvider: '@AppBundle\Personalization\FactoryPersonalizationAdapterCustomerIdProvider'
namespace AppBundle\Personalization; use Pimcore\Bundle\PersonalizedSearchBundle\Customer\PersonalizationAdapterCustomerIdProvider; use Pimcore\Bundle\EcommerceFrameworkBundle\Factory; class FactoryPersonalizationAdapterCustomerIdProvider implements PersonalizationAdapterCustomerIdProvider { public function getCustomerId(): int { return Factory::getInstance()->getEnvironment()->getCurrentUserId(); } }
注入适配器/装饰器
默认适配器(SegmentAdapter
、PurchaseHistoryAdapter
和 RelevantProductsAdapter
)以及默认装饰器(EqualWeightDecorator
和 PerformanceMeasurementDecorator
),都包含在个性化包中,可以通过依赖注入使用。只需确保实现并提供了上述所述的所有必要接口。
以下是一个适配器注入的示例
public function searchAction(SegmentAdapter $segmentAdapter, PurchaseHistoryAdapter $purchaseHistoryAdapter, RelevantProductsAdapter $relevantProductAdapter) { // use injected adapters here (see next section) }
个性化查询
适配器修改现有查询。以下示例应概述如何使用装饰器和适配器
$queryKey = 'searchTerm'; $personalizationDecorator = new EqualWeightDecorator(); $personalizationDecorator ->addAdapter($relevantProductAdapter) ->addAdapter($purchaseHistoryAdapter) ->addAdapter($segmentAdapter); $query = $personalizationDecorator->addPersonalization($query); $productListing->addQueryCondition($query, $queryKey); echo '<pre>'; print_r($personalizationDecorator->getDebugInfo()); echo '</pre>';
首先,需要注入使用的装饰器和适配器,这在代码片段中没有展示。然后定义一个装饰器来管理底层适配器。可以使用 addAdapter
方法轻松地将适配器添加到装饰器中。添加适配器后,可以调用 addPersonalization
方法来为装饰器添加个性化。此方法接受 Elasticsearch 查询作为参数,并返回修改后的个性化查询,然后可以执行该查询。
出于调试目的,可能需要了解修改(各个适配器的段和提升值)的情况。为此,存在 getDebugInfo
方法。
使用 ETL 机制
有关 ETL 机制的详细文档,包括详细的设置说明,请参阅相应的文档页面 链接。ETL 机制可以通过三种方式调用。
通过可以注入的接口程序化地调用
提取所有客户的购买历史
purchaseHistoryProvider->updateOrderIndexFromOrderDb()
或仅为单个客户
purchaseHistoryProvider->fillOrderIndex(customer)
更新客户组分配
customerGroupProvider->updateCustomerGroupAndSegmentsIndicesFromOrderDb()
通过在命令行上执行命令
./bin/console personalizedsearch:start-etl ExampleArgument
ExampleArgument
参数是可选的。如果没有提供参数,ETL 将针对购买历史和相关性产品执行,否则只针对给定的参数执行。参数的值可以是 PurchaseHistory
或 CustomerGroup
。
通过创建 cron 作业条目来自动化调用
要每小时运行整个 ETL,需要在 cron tab 中添加以下条目
* */1 * * * /home/pimcoredemo/www/bin/console personalizedsearch:start-etl >> /tmp/personalizedsearch-etl.log
有关 ETL 和其使用的更多详细信息,请参阅 ETL。
实现自定义适配器
自定义适配器应扩展 AbstractAdapter
,它实现了 AdapterInterface
。有两个方法需要实现:addPersonalization
和 getDebugInfo
。这两个方法的目标都是创建有关某些段如何提升的信息。在 addPersonalization
中,这些信息用于创建所谓的 function scores,并将其添加到查询中,而在 getDebugInfo
中,返回提升信息。有关此类实现可能的外观的详细信息,请参阅默认适配器以及更多 详细适配器文档。
最后,应将适配器添加到 services.yml
以通过依赖注入使其可用,就像默认适配器一样。在 services.yml
中的新条目应类似于以下内容
AppBundle\Personalization\Adapter\YourAdapter: ~