blue-tomato/elasticsearch-feeder

ElasticSearch 的 Schema-灵活 ProcessWire 模块,用于将页面内容导入 ElasticSearch

2.0.1 2023-10-03 20:18 UTC

This package is auto-updated.

Last update: 2024-09-03 22:07:16 UTC


README

License: MIT ProcessWire 3

此 ElasticSearch 模块适用于ProcessWire CMS/CMF,它将同步您的页面内容到 ElasticSearch 索引,为您提供方便的搜索方式。

目录

功能

  • 批量添加/更新 ElasticSearch 中的页面
  • 在页面保存/发布后添加/更新页面到 ElasticSearch
  • 在页面删除、删除或取消发布后从 ElasticSearch 中删除页面

先决条件

在您开始使用此模块之前,请确保它与您的技术 ElasticSearch 设置兼容,并且满足您的内容索引要求。我们创建此模块以支持 bonsai.io(替代方案:AWS ESElastic CloudGoogle Cloud 等)托管的 ElasticSearch SaaS 实例。它还应与自托管的 ElasticSearch 实例或 Docker 容器一起工作。

通常 ES SaaS 提供商会在其后端的设置/配置部分中告知此信息。

例如,对于 bonsai.io:https://{ES_ACCESS_KEY}:{ES_ACCESS_SECRET}@{ES_INSTANCE_URL}.bonsaisearch.net

例如,对于本地 ElasticSearch:https://:9200

安装

  1. 在您的 ProcessWire 安装根目录中执行以下命令
composer require blue-tomato/elasticsearch-feeder
  1. ProcessWire 将检测模块并将其列在后端的 模块 > 站点 > ElasticsearchFeeder 部分。导航到那里并安装它。

使用

要使用此模块,您必须设置一些模块配置和架构说明。

注意:此模块将在一个名为 elasticsearchfeeder_meta 的元字段中保存每个页面的最后更新时间和文档 ID。您可以使用 $page->meta('elasticsearchfeeder_meta') 访问此值。

配置

在 ProcessWire 模块后端中配置该模块(在模块安装后即可使用)。模块配置允许通过 ProcessWire 驱动的后端表单执行以下操作

  • 定义 ES 后端协议(http 或 https)
  • 插入 ES_ACCESS_HOST
  • 插入 ES_ACCESS_KEY(可选)
  • 插入 ES_ACCESS_SECRET(可选)
  • 插入您的架构路径(有关如何使用这些内容的说明,请参阅 架构
  • 可选地插入用于散列您的 ES ID 的前缀字符串
  • 插入模板配置(有关如何使用这些内容的说明,请参阅 架构
  • 通过单击“索引所有页面”按钮重新索引符合我们模块配置的所有页面。注意:使用此选项可能需要很长时间(主要取决于您要将多少 ProcessWire 页面发送到 ElasticSearch 索引)。
  • 或使用下面的 batchSync.php 脚本(下面描述)

架构

设置一个或多个模式,以定义哪些内容将发送到您的ElasticSearch实例。请考虑将您的模式文件(以.schema.php结尾)放置在配置模块时的目录路径中。

简单来说:对于每个ElasticSearch文档类型,必须有一个返回要在ElasticSearch实例中索引的内容的PHP函数。此函数的命名约定必须与在ProcessWire后端模块配置中声明的camelCased文档类型名称相匹配。例如,ProcessWire后端中名为news-details-page的文档类型需要名为newsDetailsPage的模式函数。

文件名本身必须与模板名称相同。例如:news-details-page.php应该是news-details-page.schema.php

模式中的页面过滤

如果模式函数返回false作为值,则页面将不会发送到ElasticSearch。您可以使用此功能来过滤页面,并仅从该模板发送特定页面到ElasticSearch。

模式函数(例如:news-details-page.schema.php)

此模块将以下参数传递给您的模式函数。

  • @arg1 $page ProcessWire页面WireArray
function newsDetailsPage($page) {

  // don't send page to Elasticsearch in case we don't want to
  if($page->property->value == "xyz") { return false; }

  // now start building the $document array you want to ship to Elasicsearch
  $document = [];
  $document['type'] = 'news-detailspage';
  $document['name'] = $page->title;

  // if you need to generate an ElasticSeach ID withtin a schema file
  $ElasticsearchFeeder = wire('modules')->get('ElasticsearchFeeder');
  $indexPrefix = $ElasticsearchFeeder->getIndexPrefix();
  $document['some_other_page'] = $ElasticsearchFeeder->createElasticSearchDocumentHashedId($page->get('some_other_page')->id, $indexPrefix),

  // send $document back to ElasticsearchFeeder module
  return $document;
}

模式函数调试

此模块提供了一种方便的方式来调试您的模式,从而查看发送到ElasticSearch的内容。您可以在保存页面后在ProcessWire管理消息栏中看到JSON输出。

要启用模块调试

  • 转到模块 > 站点 > ElasticsearchFeeder中的模块配置页面
  • 找到如下所示的调试配置区域

通过CLI或Cron批量同步

您可以通过在模块 > 站点 > ElasticsearchFeeder模块配置页面中的“索引所有页面”按钮发送您的页面。如果您有很多页面,这可能会运行很长时间,并可能导致服务器超时。

因此,您可以通过模块路径中的batchSync.php脚本来发送页面。您还可以设置一个重复的cronjob,以确保每x次进行完整同步。

batchSync.php脚本将所有页面发送到ElasticSearch。

例如

php site/modules/ElasticsearchFeeder/batchSync.php

要检查在ElasticSearch中现有的内容是否也在ProcessWire中存在且为公开可用,请使用此脚本

php site/modules/ElasticsearchFeeder/batchCleanup.php

通过代理服务器请求ElasticSearch

如果您在代理服务器后面,您可以将以下属性添加到您的config.php文件中

  • $config->httpProxy = "your-http-proxy-server.xyz:8888";
  • $config->httpsProxy = "your-https-proxy-server.xyz:5394";

通过config.php覆盖ElasticSearch连接

您可以通过$config->elasticsearchFeederConnectionOverride覆盖到ElasticSearch的连接。例如,如果您想在本地或测试服务器上使用本地ElasticSearch服务器,但让数据库值保持不变。

$config->elasticsearchFeederConnectionOverride = [
  "es_protocol" => "http",
  "es_host" => "localhost:9200",
  "es_access_key" => "",
  "es_access_secret" => ""
];

通过config.php停用ElasticSearchFeeder

如果您想防止从您的开发或测试服务器发送页面到ElasticSearch,但不想在数据库中停用模块,您可以将$config->elasticsearchFeederDisabled = true添加到您的config.phpconfig-dev.php文件中。这将防止添加索引所需的钩子。

在ProcessWire管理面板中显示ElasticSearch元信息/状态

由于我们在$page-meta()中保存了文档ID和页面最后发送到索引的时间,您也可以在管理面板中使用MarkupRuntime模块显示它们。

以下是MarkupRuntime的示例配置:

ElasticSearch版本和文档类型

请考虑,ElasticSearch 6.0.0 移除了在一个索引中支持多个文档类型的特性。本模块支持这两种变体。您可以为每个ProcessWire模板分别定义索引和文档类型的名称。例如,如果您使用ElasticSearch => 6.0.0,您可以使用相同的名称作为索引和文档类型。

https://elastic.ac.cn/guide/en/elasticsearch/reference/6.x/removal-of-types.html

支持

提交一个支持问题

贡献

在您的分支上创建一个分支,向您的分支添加提交,然后从您的分支向此仓库发起拉取请求。

要获得更深入的见解并了解模块实现细节,只需提交一个支持问题。我们将尽快回复您。

致谢

此模块由Blue Tomato团队制作。如果您想了解更多关于我们工作的信息,请关注我们的https://dev.to/btdev

许可证

关于此模块的许可信息,请参阅LICENCE.txt文件。