ingest-attachment

Плагин ingest-attachment позволяет OpenSearch извлекать содержимое и другую информацию из файлов с использованием библиотеки извлечения текста Apache Tika.

Поддерживаемые форматы документов включают PPT, PDF, RTF, ODF и многие другие (см. Поддерживаемые форматы документов Tika).

Входное поле должно быть закодировано в формате base64.

Установка плагина

Установите плагин ingest-attachment, используя следующую команду:

$$./bin/opensearch-plugin install ingest-attachment$$

Опции процессора вложений

Название Обязательный Значение по умолчанию Описание
field Да Имя поля, в котором будет храниться извлеченное содержимое.

Пример использования плагина ingest-attachment

Следующие шаги покажут вам, как начать работу с плагином ingest-attachment.

Шаг 1: Создайте индекс для хранения ваших вложений

Следующая команда создает индекс для хранения ваших вложений:

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

Шаг 2: Создайте конвейер

Следующая команда создает конвейер, содержащий процессор вложений:

PUT _ingest/pipeline/attachment
{
  "description" : "Извлечение информации о вложениях",
  "processors" : [
    {
      "attachment" : {
        "field" : "data"
      }
    }
  ]
}

Шаг 3: Сохраните вложение

Преобразуйте вложение в строку base64, чтобы передать его как данные. В этом примере команда 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

Чтобы извлечь только подмножество этих полей, определите их в свойствах процессора конвейера, как показано в следующем примере:

PUT _ingest/pipeline/attachment
{
  "description" : "Извлечение информации о вложениях",
  "processors" : [
    {
      "attachment" : {
        "field" : "data",
        "properties": ["content", "title", "author"]
      }
    }
  ]
}

Ограничение извлекаемого содержимого

Чтобы предотвратить извлечение слишком большого количества символов и перегрузку памяти узла, значение по умолчанию составляет 100_000. Вы можете изменить это значение, используя настройку indexed_chars. Например, вы можете использовать -1 для неограниченного количества символов, но необходимо убедиться, что у вас достаточно памяти HEAP на узле OpenSearch для извлечения содержимого больших документов.

Вы также можете определить этот лимит для каждого документа, используя поле запроса indexed_chars_field. Если документ содержит indexed_chars_field, оно перезапишет настройку indexed_chars, как показано в следующем примере:

PUT _ingest/pipeline/attachment
{
  "description" : "Извлечение информации о вложениях",
  "processors" : [
    {
      "attachment" : {
        "field" : "data",
        "indexed_chars" : 10,
        "indexed_chars_field" : "max_chars"
      }
    }
  ]
}

С настроенным конвейером вложений вы можете извлечь 10 символов по умолчанию, не указывая max_chars в запросе, как показано в следующем примере:

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

В качестве альтернативы вы можете изменить max_chars для каждого документа, чтобы извлечь до 15 символов, как показано в следующем примере:

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