novactive/ezalgoliasearchengine

Novactive eZ Algolia Search Engine是一个eZ Platform捆绑包,用于提供Algolia搜索集成。

安装: 52

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 10

分支: 1

开放问题: 0

类型:ezplatform-bundle

v1.0.0 2020-11-25 07:27 UTC

This package is auto-updated.

Last update: 2024-09-19 11:38:50 UTC


README

这个仓库是我们所说的“子树分割”:主仓库中一个目录的只读副本。它被Composer用于允许开发者依赖特定的捆绑包。

如果您想报告或贡献,请改为在主仓库中打开问题:[https://github.com/Novactive/Nova-eZPlatform-Bundles](https://github.com/Novactive/Nova-eZPlatform-Bundles)

文档可以通过此仓库中的.md文件获取,但也打包在这里:[https://novactive.github.io/Nova-eZPlatform-Bundles/master/AlgoliaSearchEngine/README.md.html](https://novactive.github.io/Nova-eZPlatform-Bundles/master/AlgoliaSearchEngine/README.md.html)

Novactive eZ Algolia Search Engine是一个eZ Platform捆绑包,用于提供Algolia搜索集成,使您可以使用Algolia搜索引擎索引数据并进行搜索。

得益于以下3个主要功能

  • eZ仓库搜索服务处理器实现:所有由eZ Platform用于检索内容和位置的用例都由Repository Search Service在幕后管理。此捆绑包实现了所有访问者,它们将eZ查询实例(包括标准、排序子句、分类构建器)转换为发送到Algolia的请求。
  • Algolia PHP客户端集成:内容项会自动索引,如果需要,您可以直接绕过SearchService执行Algolia查询。如果需要,可以将结果注入到ContentLocation
  • Algolia前端:Algolia的一个主要优点是他们提供的用于使用前端技术执行/实现搜索的前端组件。简化开发并提供惊人的性能。此捆绑包提供了一个使用React JS、无样式和Twitter Bootstrap的集成示例。

安装

要求

  • eZ Platform 3.1+
  • PHP 7.3

安装步骤

将以下内容添加到您的composer.json中,并运行composer update novactive/ezalgoliasearchengine以安装依赖项

# composer.json

"require": {
    "novactive/ezalgoliasearchengine": "^1.0.0"
}

JavaScript依赖项

cd ezplatform
yarn add --dev algoliasearch react react-collapsible react-dom react-instantsearch-dom

注册捆绑包

如果Symfony Flex尚未这样做,请在config\bundles.php文件中激活捆绑包。

// config\bundles.php

return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    ...
    Novactive\Bundle\eZAlgoliaSearchEngine\NovaEzAlgoliaSearchEngine::class => ['all' => true],
];

添加路由

_novaezalgoliasearchengine_routes:
    resource: '@NovaEzAlgoliaSearchEngine/Resources/config/routing.yaml'

环境变量

应将SEARCH_ENGINE环境变量设置为algolia

配置

nova_ezalgoliasearchengine:
    system:
        default:
            index_name_prefix: PREFIX
            app_id: APPLICATION_ID
            api_secret_key: ADMIN_API_KEY
            api_search_only_key: SEARCH_ONLY_PAI_KEY
            license_key: "CONTACT NOVACTIVE: direction.technique@novactive.com to get your trial"

webpack_encore:
    builds:
        nova_ezalgolia: "%kernel.project_dir%/public/assets/nova_ezalgolia/build"

framework:
    assets:
        packages:
            nova_ezalgolia:
                json_manifest_path: '%kernel.project_dir%/public/assets/nova_ezalgolia/build/manifest.json'

应在https://www.algolia.com/上创建Algolia应用程序以检索应用程序ID和API密钥。它们可以在Algolia仪表板的API密钥页面上找到。

安装包后,应运行以下命令以在Algolia上初始化索引并设置搜索属性、排序索引和分类

bin/console nova:ez:algolia:indexes:setup

用法

查询标准

在eZ查询内部创建的所有标准(作为过滤器或查询字段)都转换为Algolia过滤器字符串,如下所示:

doc_type_s:content AND (content_type_identifier_s:"article")

标准的限制

一些主要的标准尚未实现

  • 兄弟(即将推出)
  • 对象状态标识符(即将推出)
  • 用户邮箱(即将推出)
  • 用户ID(即将推出)
  • 用户登录(即将推出)
  • 是否基于用户(即将推出)
  • 是否启用用户(即将推出)
  • 地图位置距离

用户相关条件尚未实现,因为它们大多数已包含在用户元数据条件中。

地图位置距离条件尚未实现,因为Algolia地理位置过滤器选项不允许我们在同一文档中管理多个此类字段。可以通过Algolia搜索方法的特定请求选项进行位置过滤。以下是一个示例

    $query->setRequestOption('aroundLatLng', '37.7512306, -122.4584587');
    $query->setRequestOption('aroundRadius', 3000);

关于此主题的文档可以在此处找到这里

默认情况下, Algolia文档已经包含了具有地图位置字段的内容的_geoloc属性。

其他约束在逻辑运算符中。它们是

  • 全文条件不能在逻辑非或逻辑或运算符中,因为它已移动到Algoalia的查询字符串请求中。Algolia就是这样工作的。
  • AND运算符不能在逻辑非条件中;
  • AND/OR运算符不能在逻辑或条件中。

有关Algolia上特定布尔过滤器的更多信息,请参阅这里

有关如何工作的完整Algolia信息可以在这里找到。

排序

Algolia的排序基于副本。每个副本都是一个具有特定配置的复制索引,该配置指定了按哪些属性对文档进行排序。用于生成副本的属性可以在attributes_for_replicas配置参数中设置。

当使用eZ查询时,分配给查询实例的sortClauses字段将转换为副本密钥。

重新索引

所有数据(内容项和位置项)都通过bin/console ezplatform:reindex命令推送到Algolia索引。所有这些(除了在exclude_content_types参数中指定的或仅包括在include_content_types参数中的)都被转换为特定格式并通过saveObjects方法发送到Algolia。此外,一旦在Ez平台管理员仪表板上发布,允许的内容类型(包括或排除)的每个特定内容都会推送到索引中。

前端实现

带有/search URL的搜索页面被在Bundle中实现的自定义搜索控制器覆盖。为此使用了特定的路由配置。

ezplatform.search:
    path: /search
    methods: ['GET']
    defaults:
        _controller: 'Novactive\Bundle\eZAlgoliaSearchEngine\Controller\SearchController::searchAction'

带有React组件的前端实现源代码可以在search.jsx文件中找到。所有主要小部件都包含在其中,可以用作实现示例。有关React InstantSearch组件的基本安装和小部件展示的信息也可以在文档中找到。

安全注意事项

为了限制API密钥的作用域,使用受保护的API密钥。受保护的API密钥只能从Algolia API密钥列表中的只读API密钥生成。此类API密钥用于执行搜索方法,以防止可能的对其他用户的恶意请求篡改,因此它在后端执行。

换句话说,根据当前用户权限,此组件查询Algolia,包括与权限相关的隐式过滤器,以避免数据泄露。

更多信息这里

执行saveObjects方法以创建、更新或删除Ined条目时使用管理员API密钥。

高级用法

从索引中排除/包含内容类型

您可以选择包含或排除哪些内容类型在索引中。使用以下配置参数来排除或包含特定内容类型

  • nova_ezalgoliasearchengine.default.exclude_content_types
  • nova_ezalgoliasearchengine.default.include_content_types

首先检查include参数,因此它具有优先级。默认情况下,除了用户用户组之外,所有内容类型都保存到索引中。

还有以下参数

  • 可搜索属性;
  • 用于分组的属性;
  • 要检索的属性;
  • 用于副本(用于排序)的属性;

您可以在默认设置中查看发送到Algolia的属性默认列表。

要发送所有这些设置到Algolia,请使用bin/console nova:ez:algolia:indexes:setup命令。

使用查询工厂生成自定义查询

如果您想创建可以通过搜索查询工厂服务(Novactive\Bundle\eZAlgoliaSearchEngine\Core\Search\SearchQueryFactory)实现的更具体的自定义请求。使用它时,应手动指定所有请求参数,例如搜索词、过滤器、分组等,如下面的示例所示

    $query = $this->searchQueryFactory->create(
        'term',
        'content_type_identifier_s:"article"',
        ['doc_type_s']
    );
    $query->setRequestOption('attributesToRetrieve', ['content_name_s']);

副本也可以手动指定

    $query = $this->searchQueryFactory->create(
        '',
        'content_language_codes_ms:"eng-GB"',
    );
    $query->setReplicaByAttribute('location_id_i');

然后,创建的查询实例应传递给Novactive\Bundle\eZAlgoliaSearchEngine\Core\Search\Search服务的一个方法,具体取决于搜索类型

  • findContents
  • findLocations
  • find(用于原始搜索)。

还有一个事件可以让你调整工厂创建的Query。`Novactive\Bundle\eZAlgoliaSearchEngine\Event\QueryCreateEvent`