跳转到主要内容

Plone RestAPI和ElasticSearch或OpenSearch之间的采集服务队列运行器。

项目描述

Plone RestAPI和ElasticSearch 8+或OpenSearch 2+之间的摄取服务队列运行器。提供Celery任务以异步索引Plone内容。

  • 自动创建Open-/ElasticSearch...
    • 索引

    • 使用灵活的转换文件(JSON)从Plone架构创建映射,

    • 使用(与上面相同)的文件进行摄取附件管道,

  • 任务到
    • 使用所有提供的数据以及允许的角色和用户以及部分(主路径)索引内容对象

    • 取消索引内容对象

  • 从环境变量配置
    • celery,

    • elasticsearch或opensearch

    • sentry日志(可选)

安装

我们建议使用Python虚拟环境,使用 python3 -m venv venv 创建一个,并在当前终端会话中使用 source venv/bin/activate 激活它。

安装 collective.elastic.ingest 以与redis和opensearch一起使用

pip install collective.elastic.ingest[redis,opensearch]

根据所使用的队列服务器和索引服务器,额外要求各异

  • 队列服务器: redisrabbitmq

  • 索引服务器: opensearchelasticsearch

配置

配置通过环境变量和JSON文件完成。

环境

环境变量包括

INDEX_OPENSEARCH

是否使用OpenSearch或ElasticSearch。

默认值:1

INDEX_SERVER

ElasticSearch或OpenSearch服务器的URL。

默认值:localhost:9200

INDEX_USE_SSL

是否使用安全的TLS连接。

默认值:0

INDEX_VERIFY_CERTS

是否在安全连接上验证TLS证书。

默认值:0

INDEX_SSL_SHOW_WARN

是否警告未验证的TLS请求。

默认值:0

INDEX_SSL_ASSERT_HOSTNAME

是否在TLS请求中断言主机名。

默认值:0

INDEX_LOGIN

ElasticSearch 8+或OpenSearch服务器的用户名。

默认值:admin

INDEX_PASSWORD

ElasticSearch 8+或OpenSearch服务器的密码。

默认值:admin

CELERY_BROKER

Celery的代理URL。有关详细信息,请参阅docs.celeryq.dev

默认值:redis://127.0.0.1:6379/0

PLONE_SERVICE

Plone服务器的基URL

默认值:https://127.0.0.1:8080

PLONE_SITE_PREFIX_PATH

Plone服务器中要索引的站点的路径。

默认值:Plone

PLONE_SITE_PREFIX_METHOD

在从Plone服务器请求内容时是否保留前缀路径。允许的值:stripkeep

keep 上,前缀路径保留在索引/架构路径中。如果 PLONE_SERVICEhttps://127.0.0.1:8080 上运行,且 PLONE_SITE_PREFIX_PATHPlone,则摄取服务从其数据和架构中获取数据的索引/架构基本路径是 https://127.0.0.1:8080/Plone

strip 上,前缀路径从索引/架构路径中删除。如果 PLONE_SERVICEhttps://www.mydomain.tld 上运行,且 PLONE_SITE_PREFIX_PATHPlone,则索引/架构基本路径是 https://www.mydomain.tld

默认值:keep

PLONE_USER

Plone服务器的用户名,需要至少拥有网站管理员角色。

默认值:admin

PLONE_PASSWORD

Plone服务器的密码。

默认值:admin

MAPPINGS_FILE

映射配置文件的绝对路径。配置从Plone架构到ElasticSearch的字段映射。

没有默认值,必须提供。

PREPROCESSINGS_FILE

配置索引前的字段值预处理。

默认:使用此包的默认文件。

ANALYSIS_FILE

(可选)分析配置文件的绝对路径。

SENTRY_DSN

(可选)错误报告的Sentry DSN。

默认:禁用

SENTRY_INGEST

(可选)在Celery中启用Sentry报告。原因在于,当此包用作库时,SENTRY_DSN可能在Plone环境中提供。为了不覆盖任何现有的sentry-sdk初始化,此标志用于在摄取模式中特别启用Sentry报告。允许的值:true,false

默认:false

升级

从此包的1.x版本开始,在2.x中您需要更改一些环境变量的名称。

  • ELASTICSEARCH_INGEST_* 更改为 INDEX_*

  • OPENSEARCH* 更改为 INDEX_OPENSEARCH

  • PLONE_PATH 更改为 PLONE_SITE_PREFIX_PATH。另外,还有一个新选项 PLONE_SITE_PREFIX_METHOD=strip,用于从索引/架构路径中删除路径前缀。有关详细信息,请参见上文。

  • 如果您使用Sentry,则需要额外的 SENTRY_INGEST=true

JSON-文件

mappings.json

映射文件是一个具有以下结构的JSON文件

第一层:键:值对

键是 - 要在架构中找到的字段的完全限定字段名(路径)(例如 behaviors/...types/...),例如 behaviors/plone.basic/title。 - 或者基于zope.schema的字段类型的点名称,例如 plone.namedfile.field.NamedBlobImage

值是映射此特定字段或字段类型到OpenSearch或ElasticSearch的说明。实际发送到索引服务器的映射是从此说明和从Plone获取的完整架构生成的。在生成时,该过程遍历整个架构并将映射说明应用于每个字段。

首先通过完全限定的字段名进行指令查找。如果没有找到指令,则使用字段类型的点名称。

有两种类型的指令:简单指令和复杂指令。

简单指令type 定义为顶级键。类型是索引服务器为映射定义的映射类型,如 textboolean。对于某些类型,这已经足够,其他类型需要额外的键。嵌套类型就是这样的类型。在这里,propertiesdynamic 键是必需的。这些键在顶级提供。

复杂指令definition 键中定义 typedefinition 键是一个映射,其中包含 type 键和与简单指令相同的字段类型定义的附加键。对于复杂指令,还有两个其他可能的顶级键:detectionspipelines

detection 是基于模式字段参数执行某些操作的方法。目前这仅用于检测Plone列表字段或类似的 value_type。此检测器注册为 replace

管道是将处理管道添加到字段的方法。这些用于摄入二进制数据,如图像或PDF,但可以配置任何其他管道。管道被注册和执行。管道的配置包括一个、一个目标、上面定义的目标数据的类型处理器扩展

  • 源是管道输入数据的字段名。

  • 目标是管道输出数据的字段名。

  • 类型是目标字段的定义。

  • 处理器是要应用于数据的处理器列表。

  • 扩展不是直接映射相关,但在此配置,因为它定义了在后处理步骤中从哪里获取数据。二进制数据不包含在内容数据中,只提供一个下载链接。

preprocessings.json

预处理是在处理任何其他内容之前执行的步骤。它们在Plone REST API的原始数据、从Plone后端获取的完整模式和从Plone后端获取的完整内容对象上运行。每个预处理都是一个函数,它接受数据并修改完整模式或完整内容。

预处理文件由一个处理指令记录列表组成。

每个记录是一个映射,包含一个匹配、一个动作和一个配置

匹配调用一个返回布尔值的函数。如果值为true,则执行动作,否则跳过。

有两个匹配可用

always

始终匹配。

示例配置 {"match": {"type": "always"}, ...}

如果没有提供匹配,则这是默认配置。

content_exists

如果字段configuration["path"]存在于内容数据中,则匹配。路径可以指向字段foo或检查其子项,如foo/bar/baz

示例配置 {"match": {"type": "content_exists", "path": "foo"}, ...}

动作是一个函数,它接受完整模式和内容数据、配置,然后修改完整模式或完整内容。

以下是一些可用的动作

additional_schema

向完整模式添加一个附加模式。配置必须是一个有效的模式,即具有名称和字段以添加。在结果映射中,模式被添加到(新)子部分additional下的子部分preprocessed

rewrite

将内容数据从字段树中的一个位置移动到另一个位置。配置必须是一个具有sourcetarget键的映射。源source的值是要移动的数据的路径。目标target的值是数据的新位置路径(缺少的容器将被创建)。强制enforce是一个布尔值(默认:False)。如果为True,源必须存在,否则引发错误。

示例: "configuration": {"source": "@components/blocks_plaintext", "target": "blocks_plaintext", "enforce": false}

remove

从内容数据中删除字段或子字段。目标target的值是要删除的数据的路径。

field_remove

从完整模式和内容中删除字段及其字段值。部分section是部分(behaviorstypes之一)。名称name是行为或类型的名称。字段field是要删除的字段的名称。

full_remove

从完整模式中删除一个完整的行为或类型及其所有字段,并从内容中删除其字段值。section的值是部分(behaviorstypes中的一个),name的值是行为或类型的名称。

remove_empty

从内容数据中删除所有空字段。如果一个字段是None[]{}"",则认为它是空的。

analysis.json

此文件提供了用于不同定义部分的(顶层、嵌套、复杂或管道目标)mappings.json文件中的索引和分词器。

在下面的专用部分中了解更多关于此主题的信息。

启动

运行 celery 工作进程

celery -A collective.elastic.ingest.celery.app worker -c 1 -l info

或使用调试信息

celery -A collective.elastic.ingest.celery.app worker -c 1 -l debug

数字是工作进程的并发数。在生产使用中,它应设置为可用的 Plone 后端索引负载的数量。

OCI镜像使用

对于 Docker、Podman、Kubernetes 等,在 Github 容器注册表 提供了 OCI 图像。

上述环境变量用作配置。

此外,还使用以下环境变量

CELERY_CONCURRENCY

要运行并发任务的数量。

默认值:1

CELERY_LOGLEVEL

celery 的日志级别。

默认:info

MAPPINGS_FILE 变量的默认值是 /configuration/mappings.json。默认情况下,没有文件存在。

当提供到 /configuration 的挂载时,映射文件可以放在那里。或者,可以将映射文件作为 docker compose 中的配置元素 或作为 Kubernetes 中的 configmap 提供。

示例

示例配置文件在 ./examples 目录中提供。

使用Docker Compose的OpenSearch

位置:examples/docker-os/*

提供了启动带有仪表板的 Ingest、Redis 和 OpenSearch 服务器(包括 docker-compose.ymlDockerfile)的 docker-compose 文件。

先决条件

  • Docker 和 docker-compose 已安装。

  • 需要增加最大虚拟内存映射数才能运行此命令: sudo sysctl -w vm.max_map_count=262144(非永久性,请参阅 StackOverflow 帖子)。

  • 进入目录 cd examples/docker

启动已安装 ingest-attachment 插件的示例 OpenSearch 服务器的步骤

  • 使用以下命令本地构建包含插件的自定义 OpenSearch Docker 镜像

    docker buildx use default
    docker buildx build --tag opensearch-ingest-attachment:latest Dockerfile
  • 使用 docker-compose up 启动集群。

现在,您有一个运行在 https://127.0.0.1:9200 的 OpenSearch 服务器和一个运行在 https://127.0.0.1:5601 的 OpenSearch 仪表板(用户/密码:admin/admin)。OpenSearch 服务器已安装 ingest-attachment 插件。该插件使 OpenSearch 能够从 PDF 等二进制文件中提取文本。

Redis 服务器在 localhost:6379 上运行。

此外,ingest 工作进程正在运行并准备从 Plone 后端索引内容。

打开另一个终端。

在另一个终端窗口中,在 运行一个Plone后端,安装 collective.elastic.plone 插件,并在 https://127.0.0.1:8080/Plone 上创建一个项目或修改现有项目。你应该能在celery工作进程的终端窗口中看到索引任务。

对于生产使用,请确保端口 9200 没有暴露到互联网。为了安全起见,请使用防火墙规则阻止它。

使用Docker Compose的ElasticSearch

位置: examples/docker-es/*

提供了一个docker-compose文件 docker-compose.yml,用于启动Ingest、Redis和一个带Dejavu仪表板的ElasticSearch服务器。

先决条件

  • Docker 和 docker-compose 已安装。

  • 运行此操作需要增加最大虚拟内存映射需求: sudo sysctl -w vSITE_PREFIXm.max_map_count=262144(非永久性,请参阅StackOverflow帖子)。

  • 进入目录 cd examples/docker-es

使用以下命令运行集群:

source .env
docker compose up

首先,你需要设置ElasticSearch的密码,执行以下命令,并在新的终端窗口中注意打印的密码。

docker exec -it docker-es-elasticsearch-1 /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

找到用户 elastic 的密码,并将其设置在 .env 文件中的环境变量 INDEX_PASSWORD 中。停止集群(Ctrl-C),使用新设置 source .env 并重新启动它(如上所述)。

现在你有一个运行在 https://127.0.0.1:9200 上的ElasticSearch服务器和一个运行在 https://127.0.0.1:1358 上的Dejavu仪表板。 (ElasticSearch服务器默认安装了 ingest-attachment 插件)。

Redis 服务器在 localhost:6379 上运行。

此外,ingest 工作进程正在运行并准备从 Plone 后端索引内容。

打开另一个终端。

在另一个终端窗口中,运行一个安装了 collective.elastic.plone 插件的Plone后端,地址为 https://127.0.0.1:8080/Plone。在那里创建一个项目或修改现有的项目。你应该能在celery工作进程的终端窗口中看到索引任务。

对于生产使用,请确保端口 9200 没有暴露到互联网。为了安全起见,请使用防火墙规则阻止它。

本地/开发

位置: examples/docker/local/*

提供了一个非常基础的映射文件 examples/docker/local/mappings.json。要使用它,请设置 MAPPINGS_FILE=examples/mappings-basic.json,然后启动celery工作进程。提供了一个环境文件 examples/docker/local/.env,其中包含了用于本地启动的环境变量。

运行 source examples/.env 来加载环境变量。然后,使用 celery -A collective.elastic.ingest.celery.app worker -l debug 启动celery工作进程。

带有德语文本分析的复杂映射

位置: examples/docker/analysis/*

提供了一个包含德语文本分析的复杂映射文件 mappings-german-analysis.json。它与匹配的分析配置文件 analysis-german.json 和一个占位符词典文件 elasticsearch-lexicon-german.txt 一起提供。关于文本分析的更多信息,请参阅下一节。

文本分析

测试分析是可选的。在首次安装时跳过此步骤。

可以通过定制文本分析来增强搜索结果。简单的模糊搜索不需要任何分析配置就可以使用,但其限制性较大。这在像德语这样的复杂语言中尤其如此。

这是一个高级主题。

你可以在ElasticSearch文档中找到有关文本分析的相关信息。我们提供了一个用于更好搜索德语复合词的分析配置示例。

示例:可以通过查询“Lehrstelle”找到包含字符串“Lehrstellenbörse”的文档。使用具有单词列表“Lehrstelle, Börse”和额外词干分析器的分解器查询“Börse”时也应当找到。该示例分析器配置应用了一个词干分析器,可以处理单词的词形变化。这对于提高搜索结果质量是非常重要的。

分析配置是分析器的配置。这里提供的示例使用了其中两个:german_analyzergerman_exact

第一个分析器按照lexicon.txt中的单词列表分解单词。增加了一个词干分析器

第二个分析器允许使用引号搜索字符串进行精确查询。

这两个分析器应应用于字段。您可以在映射中应用它们。

示例

"behaviors/plone.basic/title": {
    "type": "text",
    "analyzer": "german_analyzer",
    "fields": {
        "exact": {
            "type": "text",
            "analyzer": "german_exact_analyzer"
        }
    }
},

使用以下命令检查您配置的分析

POST {{elasticsearchserver}}/_analyze

{
    "text": "Lehrstellenbörse",
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        "custom_dictionary_decompounder",
        "light_german_stemmer",
        "unique"
    ]
}

响应返回了分析文本“Lehrstellenbörse”的标记。

注意:在analysis.json.example中示例分析配置所使用的decompounder的单词列表文件elasticsearch-lexicon.txt必须位于您的elasticsearch服务器配置目录中。

源代码

源代码位于github的GIT分布式版本控制系统(DVCS)中,其主分支位于github。您也可以在那里报告问题。

我们很高兴看到许多分叉和pull-requests,以使这个插件变得更好。

维护者包括Jens KleinKatja Suess以及BlueDynamics Alliance开发团队。我们感激任何贡献,如果需要在PyPI上发布版本,请联系我们中的任何一位。如果需要任何培训、辅导、集成或定制,我们也提供商业支持。

开发安装

  • 克隆源代码仓库

  • 进入仓库目录

  • 推荐:创建一个Virtualenv python -mvenv env

  • 开发安装 ./bin/env/pip install -e .[test,redis,opensearch]

  • 加载环境配置 source examples/.env

许可协议

该项目受GPLv2许可。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

collective_elastic_ingest-2.1.3.tar.gz (44.9 kB 查看哈希值)

上传时间 源代码

构建分发

collective.elastic.ingest-2.1.3-py3-none-any.whl (34.6 kB 查看哈希值)

上传时间 Python 3

由以下提供支持