pimcore/personalized-product-search

此包的最新版本(v0.0.3)没有可用的许可证信息。

安装: 21

依赖: 0

建议者: 0

安全: 0

星标: 2

关注者: 10

分支: 1

开放问题: 1

类型:pimcore-bundle

v0.0.3 2020-06-30 14:26 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();
    }
}

注入适配器/装饰器

默认适配器(SegmentAdapterPurchaseHistoryAdapterRelevantProductsAdapter)以及默认装饰器(EqualWeightDecoratorPerformanceMeasurementDecorator),都包含在个性化包中,可以通过依赖注入使用。只需确保实现并提供了上述所述的所有必要接口。

以下是一个适配器注入的示例

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 将针对购买历史和相关性产品执行,否则只针对给定的参数执行。参数的值可以是 PurchaseHistoryCustomerGroup

通过创建 cron 作业条目来自动化调用

要每小时运行整个 ETL,需要在 cron tab 中添加以下条目

* */1 * * * /home/pimcoredemo/www/bin/console personalizedsearch:start-etl >> /tmp/personalizedsearch-etl.log

有关 ETL 和其使用的更多详细信息,请参阅 ETL

实现自定义适配器

自定义适配器应扩展 AbstractAdapter,它实现了 AdapterInterface。有两个方法需要实现:addPersonalizationgetDebugInfo。这两个方法的目标都是创建有关某些段如何提升的信息。在 addPersonalization 中,这些信息用于创建所谓的 function scores,并将其添加到查询中,而在 getDebugInfo 中,返回提升信息。有关此类实现可能的外观的详细信息,请参阅默认适配器以及更多 详细适配器文档

最后,应将适配器添加到 services.yml 以通过依赖注入使其可用,就像默认适配器一样。在 services.yml 中的新条目应类似于以下内容

AppBundle\Personalization\Adapter\YourAdapter: ~

详细文档

负载测试和架构

关于架构的详细文档可在以下链接中找到:这里。同样,您也可以在此链接下找到负载测试的详细信息:这里