摄取附件插件
ingest-attachment
插件使 OpenSearch 能够使用 Apache 文本提取库 Tika 从文件中提取内容和其他信息。支持的文档格式包括 PPT、PDF、RTF、ODF 和更多 Tika (支持的文档格式)。
输入字段必须是 base64 编码的二进制文件。
安装插件
使用以下命令安装 ingest-attachment
插件
./bin/opensearch-plugin install ingest-attachment
附件处理器选项
名称 | 必需 | 默认值 | 描述 |
---|---|---|---|
field | 是 | 不适用 | 获取 base64 编码二进制文件的字段。 |
target_field | 否 | 附件 | 存储附件信息的字段。 |
properties | 否 | 所有属性 | 应存储的属性数组。可以是 content 、language 、date 、title 、author 、keywords 、content_type 或 content_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
}