内容提取

编辑

连接器使用Elastic 摄取附件处理器来提取文件内容。该处理器使用Apache Tika文本提取库来提取文件。内容提取的逻辑在utils.py中定义。

虽然主要用于 PDF 和 Microsoft Office 格式,但您可以使用任何支持的格式

Enterprise Search 使用Elasticsearch 摄取管道来支持网络爬虫的二进制内容提取。默认管道 ent-search-generic-ingestion 在 Enterprise Search 首次启动时自动创建。

您可以在 Kibana 中查看此管道。自定义管道使用也是一种选择。请参阅搜索索引的摄取管道

对于高级用例,自托管提取服务可用于从大于 10MB 的文件中提取内容。

支持的文件类型

编辑

支持以下文件类型

  • .txt
  • .py
  • .rst
  • .html
  • .markdown
  • .json
  • .xml
  • .csv
  • .md
  • .ppt
  • .rtf
  • .docx
  • .odt
  • .xls
  • .xlsx
  • .rb
  • .paper
  • .sh
  • .pptx
  • .pdf
  • .doc

摄取附件处理器不支持压缩文件,例如,包含一组 PDF 的存档文件。展开存档文件,并使单个未压缩的文件可供连接器处理。

提取服务

编辑

目前,通过提取服务从大型文件中提取内容的功能仅适用于我们的部分自管理连接器。它不适用于在 Elastic Cloud 上运行的 Elastic 管理的连接器。此功能处于 beta 阶段。

标准内容提取是通过附件处理器,通过 Elasticsearch 摄取管道完成的。自管理连接器将管道提取的文件大小限制为每个文件 10MB(Elasticsearch 也对每个文件的大小有 100MB 的硬性限制)。

对于需要从大于这些限制的文件中提取内容的用例,自管理提取服务可用于自管理连接器。文件内容不是作为 attachment 发送到 Elasticsearch,而是在摄取之前由提取服务在边缘提取。然后,提取的文本在摄取时将作为文档的 body 字段包含。

要使用此功能,您需要执行以下操作

数据提取服务代码现在在此公共存储库中可用:https://github.com/elastic/data-extraction-service

可用的连接器
编辑

本地内容提取适用于以下自管理连接器

运行提取服务
编辑

自托管内容提取由单独的提取服务处理。

提取服务的版本与 Elastic Stack 不一致。对于 8.11.x 之后的版本(包括 8.17.0),您应该使用提取服务版本 0.3.x

您可以使用以下命令运行该服务

$ docker run \
  -p 8090:8090 \
  -it \
  --name extraction-service \
  docker.elastic.co/integrations/data-extraction-service:$EXTRACTION_SERVICE_VERSION
配置提取服务
编辑

您可以通过添加所需的配置,使自管理连接器能够使用自托管提取服务。自管理连接器通过配置文件中是否存在这些字段来确定是否启用了提取服务。

  1. 在您选择的文本编辑器中打开 config.yml 配置文件。
  2. 添加以下字段。它们可以添加到文件中的任何位置,只要它们从根级别开始。
# data-extraction-service settings
extraction_service:
  host: https://127.0.0.1:8090

自管理连接器和提取服务之间没有密码保护。仅当两个服务在同一网络上且在同一防火墙后面运行时,才应使用自托管提取。

字段 描述

host

提取服务的端点。如果它与您的自管理连接器在同一服务器上运行,则可以使用 https://127.0.0.1:8090

自管理连接器将在启动时对配置的 host 值执行预检。如果找到数据提取服务并且运行正常,则以下行将输出到日志中。

Data extraction service found at <HOST>.

如果在启动时没有看到此日志,请参阅对自托管内容提取服务进行故障排除

高级配置
编辑

以下字段可以包含在配置文件中。它们是可选的,如果未指定,将回退到默认值。

# data-extraction-service settings
extraction_service:
  host: https://127.0.0.1:8090
  timeout: 30
  use_file_pointers: false
  stream_chunk_size: 65536
  shared_volume_dir: '/app/files'
高级字段 描述

timeout

内容提取的超时限制(以秒为单位)。如果未设置,则默认为 30。如果您的超大文件在内容提取期间超时,请增加此值。如果超时,索引文档的 body 字段将为空字符串。

use_file_pointers

是否使用文件指针而不是将文件发送到提取服务。默认为 false。有关此设置的更多详细信息,请参阅使用文件指针

stream_chunk_size

文件分块以方便流式传输到提取服务的大小,以字节为单位。默认为 65536 (64 KB)。仅当 use_file_pointersfalse 时适用。增加此值可能会加快连接器的速度,但也会增加内存使用量。

shared_volume_dir

数据提取服务将从中提取文件的共享卷。默认为 /app/files。仅当 use_file_pointerstrue 时适用。

使用文件指针
编辑

可以将自托管提取服务设置为使用文件指针而不是通过 HTTP 请求发送文件。文件指针比发送文件更快,并且消耗的内存更少,但需要连接器框架和提取服务能够共享文件系统。这可以使用 Docker 化和非 Docker 化的自管理连接器进行设置。

非 Docker 化自管理连接器的配置
编辑

如果您正在运行非 Docker 化的自管理连接器版本,则需要确定您将下载文件以进行提取的本地目录。这可以是您愿意使用的文件系统上的任何位置。请注意,自管理连接器将使用随机文件名将文件下载到此目录,因此可能会覆盖任何已存在的文件。因此,我们建议为自托管提取使用专用目录。

示例

  1. 在此示例中,我们将使用 /app/files 作为本地目录和容器目录。当您运行提取服务 Docker 容器时,可以使用命令行选项 -v /app/files:/app/files 将该目录挂载为卷。

    $ docker run \
      -p 8090:8090 \
      -it \
      -v /app/files:/app/files \
      --name extraction-service \
      docker.elastic.co/integrations/data-extraction-service:$EXTRACTION_SERVICE_VERSION

    由于此功能在非 Docker 化设置的代码库中的工作方式,本地文件路径和 Docker 容器的文件路径必须相同。例如,如果使用 /app/files,则必须将目录挂载为 -v /app/files:/app/files。如果任一目录不同,则自管理连接器将无法为提取服务提供准确的文件指针。使用 Docker 化的自管理连接器时,这不是一个因素。

  2. 接下来,在运行自管理连接器之前,请务必使用正确的信息更新配置文件。

    # data-extraction-service settings
    extraction_service:
      host: https://127.0.0.1:8090
      use_file_pointers: true
      shared_volume_dir: '/app/files'
  3. 然后,剩下的就是启动自管理连接器并运行同步。如果您遇到任何意外错误,请参阅对自托管内容提取服务进行故障排除
Docker 化自管理连接器的配置
编辑

从 Docker 化的自管理连接器使用自托管提取时,除了在 Docker 中运行自管理连接器之外,还需要执行一些额外的步骤。

  • 自托管提取服务需要与自管理连接器和 Elasticsearch 共享相同的网络。
  • 自管理连接器和提取服务还需要共享一个卷。您可以决定将卷挂载到这些 Docker 容器内的哪个目录上,但该目录对于两个 Docker 容器必须相同。

示例

  1. 首先,为两个 Docker 容器设置一个共享的卷。这将是下载文件然后从中提取文件的位置。

    $ docker volume create --name extraction-service-volume
  2. 如果您尚未设置网络,则可以立即创建它。

    $ docker network create elastic
  3. 在运行提取服务时,包括 Docker 卷名称和网络作为参数。在此示例中,我们将使用 /app/files 作为我们的容器目录。

    $ docker run \
      -p 8090:8090 \
      -it \
      -v extraction-service-volume:/app/files \
      --network "elastic" \
      --name extraction-service \
      docker.elastic.co/integrations/data-extraction-service:$EXTRACTION_SERVICE_VERSION
  4. 接下来,您可以按照在 Docker 中运行自管理连接器的说明,直到步骤 4. 更新自管理连接器的配置文件。设置配置时,请务必为自托管内容提取服务添加以下设置。请注意,host 现在将引用内部 Docker 端点,而不是 localhost。

    # data-extraction-service settings
    extraction_service:
      host: http://host.docker.internal:8090
      use_file_pointers: true
      shared_volume_dir: '/app/files'
  5. 接下来,在步骤 5. 运行 Docker 镜像 中,我们只需要使用 -v extraction-service-volume:/app/files 在运行命令中添加新的共享卷。

    $ docker run \
      -v ~/connectors-config:/config \
      -v extraction-service-volume:/app/files \
      --network "elastic" \
      --tty \
      --rm \
      docker.elastic.co/enterprise-search/elastic-connectors:$CONNECTOR_CLIENT_VERSION \
      /app/bin/elastic-ingest \
      -c /config/config.yml
  6. 现在应该设置好自管理连接器和提取服务 Docker 容器来共享文件。运行测试同步以确保一切配置正确。如果您遇到任何意外错误,请参阅对自托管提取服务进行故障排除
自托管提取服务日志
编辑

提取服务会生成两个不同的日志文件,这些文件在进行故障排除时可能很有用。它们在 Docker 容器内部保存在以下文件位置:

  • /var/log/openresty.log 用于请求流量日志
  • /var/log/tika.log 用于 tikaserver jar 日志

可以通过将 docker exectail 命令结合使用,从 Docker 外部查看日志。

$ docker exec extraction-service /bin/sh -c "tail /var/log/openresty.log"
$ docker exec extraction-service /bin/sh -c "tail /var/log/tika.log"
自行托管提取服务的故障排除
编辑

在使用自行托管提取服务时,可能会出现以下警告日志。本节中的每个日志后面都附有对可能发生的情况的描述以及建议的修复方法。

Extraction service is not configured, skipping its preflight check.

配置文件缺少 extraction_service.host 字段。如果要使用此服务,请检查配置文件是否格式正确,并且存在所需的字段。

Data extraction service found at <HOST>, but health-check returned <RESPONSE STATUS>.

/ping 端点返回非 200 响应。这可能意味着提取服务不健康,可能需要重新启动,或者配置的 extraction_service.host 不正确。您可以在数据提取服务日志中找到有关发生情况的更多信息。

Expected to find a running instance of data extraction service at <HOST> but failed. <ERROR>.

健康检查返回超时或客户端连接错误。

  • 超时可能是由于提取服务服务器未运行,或无法从配置文件中配置的 host 访问导致的。
  • 服务器连接错误是提取服务上的内部错误。您需要调查数据提取服务日志
Extraction service has been initialised but no extraction service configuration was found. No text will be extracted for this sync.

您已为连接器启用了自行托管的提取服务,但配置文件缺少 extraction_service.host 字段。请检查配置文件是否格式正确,并且存在所需的字段。

Extraction service could not parse <FILENAME>. Status: <RESPONSE STATUS>; <ERROR NAME>: <ERROR MESSAGE>.

每次无法提取文件时,都会出现此警告。通常, <错误消息> 将提供有关提取失败原因的解释。如果消息不清楚,请联系支持人员。当文件提取失败时,它将在 body 字段中以空字符串进行索引。