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]
根据所使用的队列服务器和索引服务器,额外要求各异
队列服务器: redis 或 rabbitmq。
索引服务器: opensearch 或 elasticsearch。
配置
配置通过环境变量和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服务器请求内容时是否保留前缀路径。允许的值:strip,keep
在 keep 上,前缀路径保留在索引/架构路径中。如果 PLONE_SERVICE 在 https://127.0.0.1:8080 上运行,且 PLONE_SITE_PREFIX_PATH 为 Plone,则摄取服务从其数据和架构中获取数据的索引/架构基本路径是 https://127.0.0.1:8080/Plone。
在 strip 上,前缀路径从索引/架构路径中删除。如果 PLONE_SERVICE 在 https://www.mydomain.tld 上运行,且 PLONE_SITE_PREFIX_PATH 为 Plone,则索引/架构基本路径是 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 定义为顶级键。类型是索引服务器为映射定义的映射类型,如 text 或 boolean。对于某些类型,这已经足够,其他类型需要额外的键。嵌套类型就是这样的类型。在这里,properties 和 dynamic 键是必需的。这些键在顶级提供。
复杂指令 在 definition 键中定义 type。 definition 键是一个映射,其中包含 type 键和与简单指令相同的字段类型定义的附加键。对于复杂指令,还有两个其他可能的顶级键:detections 和 pipelines。
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
将内容数据从字段树中的一个位置移动到另一个位置。配置必须是一个具有source和target键的映射。源source的值是要移动的数据的路径。目标target的值是数据的新位置路径(缺少的容器将被创建)。强制enforce是一个布尔值(默认:False)。如果为True,源必须存在,否则引发错误。
示例: "configuration": {"source": "@components/blocks_plaintext", "target": "blocks_plaintext", "enforce": false}
- remove
从内容数据中删除字段或子字段。目标target的值是要删除的数据的路径。
- field_remove
从完整模式和内容中删除字段及其字段值。部分section是部分(behaviors或types之一)。名称name是行为或类型的名称。字段field是要删除的字段的名称。
- full_remove
从完整模式中删除一个完整的行为或类型及其所有字段,并从内容中删除其字段值。section的值是部分(behaviors或types中的一个),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.yml 和 Dockerfile)的 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_analyzer和german_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 Klein、Katja 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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0b8c959fdc660571c55842e8fa90a7fd9c3d31d442fb64ef3ba4febcb7889aaa |
|
MD5 | abf9fef02fb689a88eb6c47953b3bb4d |
|
BLAKE2b-256 | 7fae4ce279bab919c8b2aae30f22209bbf37e45e99798bfa70d747313f2f31f3 |
collective.elastic.ingest-2.1.3-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 924c552536d1c98a008236965641bd98521c5e9e17167a816f58ff8fbbb395d2 |
|
MD5 | 99268253febeebac06777e6027667608 |
|
BLAKE2b-256 | 4c46a6e02051e7cb98665129108c6546d7c8345268f05f0ff17d04b4feee46fd |