Процессор вложений
Обработчик вложений позволяет Elasticsearch извлекать вложения файлов в распространённых форматах (таких как PPT, XLS и PDF), используя библиотеку извлечения текста Apache Tika.
Поле source должно быть бинарным, закодированным в base64. Если вы не хотите нести издержки преобразования между base64, вы можете использовать формат CBOR вместо JSON и указать поле как массив байтов вместо строкового представления. В этом случае обработчик пропустит декодирование base64.
Использование обработчика вложений в конвейере
Таблица 4. Параметры вложений
| Имя | Обязательно | По умолчанию | Описание |
|---|---|---|---|
| да | - | Поле для получения закодированного в base64 поля |
| нет | attachment | Поле, которое будет содержать информацию о вложении |
| нет | 100000 | Количество символов, используемых для извлечения, чтобы предотвратить создание слишком больших полей. Используйте |
| нет |
| Имя поля, в котором вы можете переопределить количество символов, используемых для извлечения. См. |
| нет | все свойства | Массив свойств для выбора для сохранения. Может быть |
| нет |
| Если |
| нет |
| Если |
| нет | Поле, содержащее имя ресурса для декодирования. Если указано, обработчик передает это имя ресурса подчинённой библиотеке Tika для активации Обнаружения на основе имени ресурса. |
Пример
Если вы добавляете файлы к JSON-документам, вам сначала необходимо закодировать файл как строку base64. В системах, подобных Unix, это можно сделать с помощью команды base64:
base64 -in myfile.rtf
Команда возвращает строку base64-кодированного файла. Следующая строка base64 относится к файлу .rtf, содержащему текст Lorem ipsum dolor sit amet: e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=.
Используйте обработчик вложений для декодирования строки и извлечения свойств файла:
response = client.ingest.put_pipeline(
id: 'attachment',
body: {
description: 'Extract attachment information',
processors: [
{
attachment: {
field: 'data',
remove_binary: false
}
}
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'my_id',
pipeline: 'attachment',
body: {
data: 'e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0='
}
)
puts response
response = client.get(
index: 'my-index-000001',
id: 'my_id'
)
puts response PUT _ingest/pipeline/attachment
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"remove_binary": false
}
}
]
}
PUT my-index-000001/_doc/my_id?pipeline=attachment
{
"data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
}
GET my-index-000001/_doc/my_id Объект attachment документа содержит извлеченные свойства файла:
{
"found": true,
"_index": "my-index-000001",
"_id": "my_id",
"_version": 1,
"_seq_no": 22,
"_primary_term": 1,
"_source": {
"data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
"attachment": {
"content_type": "application/rtf",
"language": "ro",
"content": "Lorem ipsum dolor sit amet",
"content_length": 28
}
}
} Сохранение бинарного поля в документе может потребовать значительных ресурсов. Сильно рекомендуется удалить это поле из документа. Установите remove_binary на true для автоматического удаления поля.
Экспортированные поля
Поля, которые могут быть извлечены из документа:
-
content, -
title, -
author, -
keywords, -
date, -
content_type, -
content_length, -
language, -
modified, -
format, -
identifier, -
contributor, -
coverage, -
modifier, -
creator_tool, -
publisher, -
relation, -
rights, -
source, -
type, -
description, -
print_date, -
metadata_date, -
latitude, -
longitude, -
altitude, -
rating, -
comments
Для извлечения только определённых полей, укажите массив properties:
response = client.ingest.put_pipeline(
id: 'attachment',
body: {
description: 'Extract attachment information',
processors: [
{
attachment: {
field: 'data',
properties: [
'content',
'title'
],
remove_binary: false
}
}
]
}
)
puts response PUT _ingest/pipeline/attachment
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"properties": [ "content", "title" ],
"remove_binary": false
}
}
]
} Извлечение содержимого из бинарных данных является ресурсоёмкой операцией и потребляет много ресурсов. Сильно рекомендуется запускать конвейеры с этим процессором на выделенном узле индексирования.
Использование обработчика вложений с CBOR
Чтобы избежать кодирования и декодирования JSON в base64, вы можете передать данные CBOR обработчику вложений. Например, следующий запрос создаёт конвейер cbor-attachment, который использует обработчик вложений.
response = client.ingest.put_pipeline(
id: 'cbor-attachment',
body: {
description: 'Extract attachment information',
processors: [
{
attachment: {
field: 'data',
remove_binary: false
}
}
]
}
)
puts response PUT _ingest/pipeline/cbor-attachment
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"remove_binary": false
}
}
]
} Следующий скрипт Python передаёт данные CBOR в HTTP-запрос индексирования, который включает конвейер cbor-attachment. Заголовки HTTP-запроса используют тип контента content-type application/cbor.
Не все клиенты Elasticsearch поддерживают пользовательские заголовки HTTP-запросов.
import cbor2
import requests
file = 'my-file'
headers = {'content-type': 'application/cbor'}
with open(file, 'rb') as f:
doc = {
'data': f.read()
}
requests.put(
'http://localhost:9200/my-index-000001/_doc/my_id?pipeline=cbor-attachment',
data=cbor2.dumps(doc),
headers=headers
) Ограничение количества извлечённых символов
Чтобы предотвратить извлечение слишком большого количества символов и перегрузку узла памяти, количество символов, используемых для извлечения, по умолчанию ограничено 100000. Вы можете изменить это значение, установив indexed_chars. Используйте -1 для снятия ограничения, но убедитесь, что у вашего узла достаточно HEAP для извлечения содержимого очень больших документов.
Вы также можете определить это ограничение для каждого документа, извлекая ограничение из заданного поля. Если документ содержит это поле, оно переопределит значение indexed_chars. Для установки этого поля задайте значение indexed_chars_field.
Например:
response = client.ingest.put_pipeline(
id: 'attachment',
body: {
description: 'Extract attachment information',
processors: [
{
attachment: {
field: 'data',
indexed_chars: 11,
indexed_chars_field: 'max_size',
remove_binary: false
}
}
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'my_id',
pipeline: 'attachment',
body: {
data: 'e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0='
}
)
puts response
response = client.get(
index: 'my-index-000001',
id: 'my_id'
)
puts response PUT _ingest/pipeline/attachment
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"indexed_chars" : 11,
"indexed_chars_field" : "max_size",
"remove_binary": false
}
}
]
}
PUT my-index-000001/_doc/my_id?pipeline=attachment
{
"data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
}
GET my-index-000001/_doc/my_id Возвращает это:
{
"found": true,
"_index": "my-index-000001",
"_id": "my_id",
"_version": 1,
"_seq_no": 35,
"_primary_term": 1,
"_source": {
"data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
"attachment": {
"content_type": "application/rtf",
"language": "is",
"content": "Lorem ipsum",
"content_length": 11
}
}
} response = client.ingest.put_pipeline(
id: 'attachment',
body: {
description: 'Extract attachment information',
processors: [
{
attachment: {
field: 'data',
indexed_chars: 11,
indexed_chars_field: 'max_size',
remove_binary: false
}
}
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'my_id_2',
pipeline: 'attachment',
body: {
data: 'e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=',
max_size: 5
}
)
puts response
response = client.get(
index: 'my-index-000001',
id: 'my_id_2'
)
puts response PUT _ingest/pipeline/attachment
{
"description" : "Extract attachment information",
"processors" : [
{
"attachment" : {
"field" : "data",
"indexed_chars" : 11,
"indexed_chars_field" : "max_size",
"remove_binary": false
}
}
]
}
PUT my-index-000001/_doc/my_id_2?pipeline=attachment
{
"data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
"max_size": 5
}
GET my-index-000001/_doc/my_id_2 Возвращает это:
{
"found": true,
"_index": "my-index-000001",
"_id": "my_id_2",
"_version": 1,
"_seq_no": 40,
"_primary_term": 1,
"_source": {
"data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
"max_size": 5,
"attachment": {
"content_type": "application/rtf",
"language": "sl",
"content": "Lorem",
"content_length": 5
}
}
} Использование обработчика вложений с массивами
Для использования обработчика вложений внутри массива вложений необходим обработчик foreach. Это позволяет запускать обработчик вложений на отдельных элементах массива.
Например, при таком источнике:
{
"attachments" : [
{
"filename" : "ipsum.txt",
"data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo="
},
{
"filename" : "test.txt",
"data" : "VGhpcyBpcyBhIHRlc3QK"
}
]
} В этом случае мы хотим обработать поле data в каждом элементе поля attachments и вставить свойства в документ, поэтому используется следующий обработчик foreach:
response = client.ingest.put_pipeline(
id: 'attachment',
body: {
description: 'Extract attachment information from arrays',
processors: [
{
foreach: {
field: 'attachments',
processor: {
attachment: {
target_field: '_ingest._value.attachment',
field: '_ingest._value.data',
remove_binary: false
}
}
}
}
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'my_id',
pipeline: 'attachment',
body: {
attachments: [
{
filename: 'ipsum.txt',
data: 'dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo='
},
{
filename: 'test.txt',
data: 'VGhpcyBpcyBhIHRlc3QK'
}
]
}
)
puts response
response = client.get(
index: 'my-index-000001',
id: 'my_id'
)
puts response PUT _ingest/pipeline/attachment
{
"description" : "Extract attachment information from arrays",
"processors" : [
{
"foreach": {
"field": "attachments",
"processor": {
"attachment": {
"target_field": "_ingest._value.attachment",
"field": "_ingest._value.data",
"remove_binary": false
}
}
}
}
]
}
PUT my-index-000001/_doc/my_id?pipeline=attachment
{
"attachments" : [
{
"filename" : "ipsum.txt",
"data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo="
},
{
"filename" : "test.txt",
"data" : "VGhpcyBpcyBhIHRlc3QK"
}
]
}
GET my-index-000001/_doc/my_id Возвращает это:
{
"_index" : "my-index-000001",
"_id" : "my_id",
"_version" : 1,
"_seq_no" : 50,
"_primary_term" : 1,
"found" : true,
"_source" : {
"attachments" : [
{
"filename" : "ipsum.txt",
"data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo=",
"attachment" : {
"content_type" : "text/plain; charset=ISO-8859-1",
"language" : "en",
"content" : "this is\njust some text",
"content_length" : 24
}
},
{
"filename" : "test.txt",
"data" : "VGhpcyBpcyBhIHRlc3QK",
"attachment" : {
"content_type" : "text/plain; charset=ISO-8859-1",
"language" : "en",
"content" : "This is a test",
"content_length" : 16
}
}
]
}
} Обратите внимание, что нужно установить target_field, иначе используется значение по умолчанию, которое является полем верхнего уровня attachment. Свойства этого поля верхнего уровня будут содержать значение только первого вложения. Однако, установив target_field в значение поля _ingest._value, вы правильно ассоциируете свойства с соответствующим вложением.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/attachment.html