Link Search Menu Expand Document Documentation Menu

摄取附件插件

ingest-attachment 插件使 OpenSearch 能够使用 Apache 文本提取库 Tika 从文件中提取内容和其他信息。支持的文档格式包括 PPT、PDF、RTF、ODF 和更多 Tika (支持的文档格式)。

输入字段必须是 base64 编码的二进制文件。

安装插件

使用以下命令安装 ingest-attachment 插件

./bin/opensearch-plugin install ingest-attachment

附件处理器选项

名称 必需 默认值 描述
field 不适用 获取 base64 编码二进制文件的字段。
target_field 附件 存储附件信息的字段。
properties 所有属性 应存储的属性数组。可以是 contentlanguagedatetitleauthorkeywordscontent_typecontent_length
indexed_chars 100_000 用于提取的字符数,以防止字段过大。使用 -1 表示无限制。
indexed_chars_field null 用于覆盖提取字符数的字段名称,例如 indexed_chars
ignore_missing false 当为 true 时,如果指定的字段不存在,处理器将退出而不修改文档。

示例

以下步骤展示了如何开始使用 ingest-attachment 插件。

步骤 1:为存储附件创建索引

以下命令创建一个用于存储附件的索引

PUT /example-attachment-index
{
  "mappings": {
    "properties": {}
  }
}

步骤 2:创建管道

以下命令创建一个包含附件处理器的管道

PUT _ingest/pipeline/attachment
{
  "description" : "Extract attachment information",
  "processors" : [
    {
      "attachment" : {
        "field" : "data"
      }
    }
  ]
}

步骤 3:存储附件

将附件转换为 base64 字符串,作为 data 传递。在此示例中,base64 命令转换文件 lorem.rtf

base64 lorem.rtf

或者,您可以使用 Node.js 将文件读取为 base64,如下列命令所示

import * as fs from "node:fs/promises";
import path from "node:path";

const filePath = path.join(import.meta.dirname, "lorem.rtf");
const base64File = await fs.readFile(filePath, { encoding: "base64" });

console.log(base64File);

.rtf 文件包含以下 base64 文本

Lorem ipsum dolor sit amet: e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=

PUT example-attachment-index/_doc/lorem_rtf?pipeline=attachment
{
  "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
}

查询结果

处理完附件后,您现在可以使用搜索查询来搜索数据,如下例所示

POST example-attachment-index/_search
{
  "query": {
    "match": {
      "attachment.content": "ipsum"
    }
  }
}

OpenSearch 响应如下

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.1724279,
    "hits": [
      {
        "_index": "example-attachment-index",
        "_id": "lorem_rtf",
        "_score": 1.1724279,
        "_source": {
          "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
          "attachment": {
            "content_type": "application/rtf",
            "language": "pt",
            "content": "Lorem ipsum dolor sit amet",
            "content_length": 28
          }
        }
      }
    ]
  }
}

提取的信息

可以使用该插件提取以下字段

  • content
  • language
  • date
  • title
  • author
  • keywords
  • content_type
  • content_length

若要仅提取这些字段的一个子集,请在管道处理器的 properties 中定义它们,如下例所示

PUT _ingest/pipeline/attachment
{
  "description" : "Extract attachment information",
  "processors" : [
    {
      "attachment" : {
        "field" : "data",
        "properties": ["content", "title", "author"]
      }
    }
  ]
}

限制提取的内容

为防止提取过多字符并导致节点内存过载,默认限制为 100_000。您可以使用 indexed_chars 设置更改此值。例如,您可以使用 -1 表示不限制字符数,但您需要确保 OpenSearch 节点上有足够的 HEAP 空间来提取大型文档的内容。

您还可以使用 indexed_chars_field 请求字段为每个文档定义此限制。如果文档包含 indexed_chars_field,它将覆盖 indexed_chars 设置,如下例所示

PUT _ingest/pipeline/attachment
{
  "description" : "Extract attachment information",
  "processors" : [
    {
      "attachment" : {
        "field" : "data",
        "indexed_chars" : 10,
        "indexed_chars_field" : "max_chars",
      }
    }
  ]
}

配置附件管道后,您无需在请求中指定 max_chars 即可提取默认的 10 个字符,如下例所示

PUT example-attachment-index/_doc/lorem_rtf?pipeline=attachment
{
  "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
}

或者,您可以更改每个文档的 max_char 以提取最多 15 个字符,如下例所示

PUT example-attachment-index/_doc/lorem_rtf?pipeline=attachment
{
  "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  "max_chars": 15
}