OpenSearch

Поддерживается только производитель

Компонент OpenSearch позволяет взаимодействовать с API OpenSearch (opens in a new tab) 2.8.x с помощью клиентской библиотеки Java API.

Пользователям Maven необходимо добавить следующую зависимость для pom.xmlэтого компонента:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-opensearch</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

URI format

opensearch://clusterName[?options]

Configuring Options

Компоненты Camel настраиваются на двух отдельных уровнях:

  • уровень компонентов

  • уровень конечной точки

Configuring Component Options

На уровне компонентов задаются общие и общие конфигурации, которые затем наследуются конечными точками. Это самый высокий уровень конфигурации.

Например, компонент может иметь настройки безопасности, учетные данные для аутентификации, URL-адреса для сетевого подключения и т. д.

У некоторых компонентов всего несколько параметров, а у других -- много. Поскольку компоненты обычно имеют предустановленные значения по умолчанию, которые широко используются, зачастую вам может потребоваться настроить лишь несколько параметров компонента, а то и вовсе ни одного.

Вы можете настроить компоненты, используя:

  • Компонент DSL (opens in a new tab) .

  • в файле конфигурации ( application.propertiesфайлы *.yaml, и т.д.).

  • непосредственно в коде Java.

Configuring Endpoint Options

Настройка конечных точек обычно занимает больше времени, поскольку у них есть множество параметров. Эти параметры помогают вам настроить функции конечной точки. Параметры также классифицируются по тому, используется ли конечная точка как потребитель ( от ), как производитель ( от ) или и то, и другое.

Конечные точки чаще всего настраиваются непосредственно в URI конечной точки в виде параметров пути и запроса . Вы также можете использовать Endpoint DSL (opens in a new tab) и DataFormat DSL (opens in a new tab) в качестве типобезопасного способа настройки конечных точек и форматов данных в Java.

Хорошей практикой при настройке параметров является использование заполнителей свойств (opens in a new tab) .

Заполнители свойств обеспечивают несколько преимуществ:

  • Они помогают предотвратить использование жестко запрограммированных URL-адресов, номеров портов, конфиденциальной информации и других настроек.

  • Они позволяют вынести конфигурацию за пределы кода.

  • Они помогают коду стать более гибким и пригодным для повторного использования.

В следующих двух разделах перечислены все параметры, сначала для компонента, а затем для конечной точки.

Component Options

Компонент OpenSearch поддерживает 13 опций, которые перечислены ниже.

connectionTimeout (producer)

  • Время ожидания в мс до истечения времени ожидания соединения.

  • По умолчанию: 30000

  • Тип: int

hostAddresses (producer)

  • Список адресов удалённого транспорта, разделённых запятыми, в формате IP:Port. Параметры IP и Port необходимо оставить пустыми, чтобы вместо них учитывались hostAddresses.

  • По умолчанию:

  • Тип: String

lazyStartProducer (producer)

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: boolean

maxRetryTimeout (producer)

  • Время в мс до повторной попытки.

  • По умолчанию: 30000

  • Тип: int

socketTimeout (producer)

  • Время ожидания в мс до истечения времени ожидания сокета.

  • По умолчанию: 30000

  • Тип: int

autowiredEnabled (advanced)

  • Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.

  • По умолчанию: true

  • Тип: boolean

client (advanced)

  • Autowired : использование существующего настроенного клиента OpenSearch вместо создания отдельного клиента для каждой конечной точки. Это позволяет настроить клиент с помощью специальных параметров.

  • По умолчанию:

  • Тип: RestClient

enableSniffer (advanced)

  • Включить автоматическое обнаружение узлов в работающем кластере OpenSearch. Если эта опция используется вместе со Spring Boot, она управляется конфигурацией Spring Boot (см. раздел Отключение сниффера в Spring Boot).

  • По умолчанию: false

  • Тип: boolean

sniffAfterFailureDelay (advanced)

  • Задержка выполнения анализа, запланированная после сбоя (в миллисекундах).

  • По умолчанию: 60000

  • Тип: int

snifferInterval (advanced)

  • Интервал между последовательными выполнениями обычного анализа трафика в миллисекундах. Будет учитываться, если отключено sniffOnFailure или если между последовательными выполнениями анализа трафика нет сбоев.

  • По умолчанию: 300000

  • Тип: int

enableSSL (security)

  • Включить SSL.

  • По умолчанию: false

  • Тип: boolean

password (security)

  • Пароль для аутентификации.

  • По умолчанию:

  • Тип: String

user (security)

  • Базовая аутентификация пользователя.

  • По умолчанию:

  • Тип: String

Endpoint Options

Конечная точка OpenSearch настраивается с использованием синтаксиса URI:

opensearch:clusterName

Со следующими параметрами пути и запроса :

Path Parameters (1 parameters)

clusterName (producer)

  • Тип: Обязательное имя кластера.

  • По умолчанию:

  • Тип: String

Query Parameters (20 parameters)

connectionTimeout (producer)

  • Время ожидания в мс до истечения времени ожидания соединения.

  • По умолчанию: 30000

  • Тип: int

disconnect (producer)

  • Отключитесь после завершения вызова производителя.

  • По умолчанию: false

  • Тип: boolean

from (producer)

  • Начальный индекс ответа.

  • По умолчанию:

  • Тип: Integer

hostAddresses (producer)

  • Список удаленных транспортных адресов в формате ip:port, разделенных запятыми, для использования

  • По умолчанию:

  • Тип: String

indexName (producer)

  • Тип: Имя индекса, против которого необходимо действовать.

  • По умолчанию:

  • Тип: String

maxRetryTimeout (producer)

  • Время в мс до повторной попытки.

  • По умолчанию: 30000

  • Тип: int

operation (producer)

  • Какую операцию сделать.

    Значения перечисления:

    • Index

    • Update

    • Bulk

    • GetById

    • MultiGet

    • MultiSearch

    • Delete

    • DeleteIndex

    • Search

    • Exists

    • Ping

  • По умолчанию:

  • Тип: OpensearchOperation

scrollKeepAliveMs (producer)

  • Время в мс, в течение которого OpenSearch будет поддерживать контекст поиска активным.

  • По умолчанию: 60000

  • Тип: int

size (producer)

  • Размер ответа.

  • По умолчанию:

  • Тип: Integer

socketTimeout (producer)

  • Время ожидания в мс до истечения времени ожидания сокета.

  • По умолчанию: 30000

  • Тип: int

useScroll (producer)

  • Включить использование прокрутки.

  • По умолчанию: false

  • Тип: boolean

waitForActiveShards (producer)

  • Создание индекса происходит до тех пор, пока не станет доступно необходимое для записи количество шардов.

  • По умолчанию: 1

  • Тип: int

lazyStartProducer (producer (advanced))

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: boolean

documentClass (advanced)

  • Класс, используемый при десериализации документов.

  • По умолчанию: ObjectNode

  • Тип: Class

enableSniffer (advanced)

  • Включить автоматическое обнаружение узлов в работающем кластере OpenSearch. Если эта опция используется вместе со Spring Boot, она управляется конфигурацией Spring Boot (см. раздел Отключение сниффера в Spring Boot).

  • По умолчанию:

  • Тип: boolean

hostnameVerifier (advanced)

  • Класс, используемый в качестве HostnameVerifier. По умолчанию HostnameVerifier отсутствует.

  • По умолчанию:

  • Тип: HostnameVerifier

sniffAfterFailureDelay (advanced)

  • Тип: Задержка выполнения анализа, запланированная после сбоя (в миллисекундах).

  • По умолчанию: 60000

  • Тип: int

snifferInterval (advanced)

  • Интервал между последовательными выполнениями обычного анализа трафика в миллисекундах. Будет учитываться, если отключено sniffOnFailure или если между последовательными выполнениями анализа трафика нет сбоев.

  • По умолчанию: 300000

  • Тип: int

certificatePath (security)

  • Сертификат, который можно использовать для доступа к кластеру ES. По умолчанию он загружается из classpath, но можно добавить префикс classpath:, file: или http: для загрузки ресурса из других систем.

  • По умолчанию:

  • Тип: String

enableSSL (security)

  • Включить SSL.

  • По умолчанию: false

  • Тип: boolean

Message Headers

Компонент OpenSearch поддерживает 9 заголовков сообщений, которые перечислены ниже:

operation (producer)

Constant: PARAM_OPERATION (opens in a new tab)

  • Операция, которую необходимо выполнить.

    Значения перечисления:

    • Index

    • Update

    • Bulk

    • GetById

    • MultiGet

    • MultiSearch

    • Delete

    • DeleteIndex

    • Search

    • Exists

    • Ping

  • По умолчанию:

  • Тип: OpensearchOperation

indexId (producer)

Constant: PARAM_INDEX_ID (opens in a new tab)

  • Идентификатор индексированного документа.

  • По умолчанию:

  • Тип: String

indexName (producer)

Constant: PARAM_INDEX_NAME (opens in a new tab)

  • Тип: Имя индекса, против которого необходимо действовать.

  • По умолчанию:

  • Тип: String

documentClass (producer)

Constant: PARAM_DOCUMENT_CLASS (opens in a new tab)

  • Полное квалифицированное имя класса документа, подлежащего демаршалированию.

  • По умолчанию: ObjectNode

  • Тип: Class

waitForActiveShards (producer)

Constant: PARAM_WAIT_FOR_ACTIVE_SHARDS (opens in a new tab)

  • Создание индекса происходит до тех пор, пока не станет доступно необходимое для записи количество сегментов.

  • По умолчанию:

  • Тип: Integer

scrollKeepAliveMs (producer)

Constant: PARAM_SCROLL_KEEP_ALIVE_MS (opens in a new tab)

  • Начальный индекс ответа.

  • По умолчанию:

  • Тип: Integer

useScroll (producer)

Constant: PARAM_SCROLL (opens in a new tab)

  • Тип: Установите значение true, чтобы включить использование прокрутки.

  • По умолчанию:

  • Тип: Boolean

size (producer)

Constant: PARAM_SIZE (opens in a new tab)

  • Размер ответа.

  • По умолчанию:

  • Тип: Integer

from (producer)

Constant: PARAM_FROM (opens in a new tab)

  • Тип: Начальный индекс ответа.

  • По умолчанию:

  • Тип: Integer

Usage

Message Operations

В настоящее время поддерживаются следующие операции OpenSearch (opens in a new tab) . Задайте параметр URI конечной точки или заголовок обмена с ключом «operation» и одним из следующих значений. Некоторые операции также требуют установки других параметров или тела сообщения.

Index

  • Map, String, byte[], Reader, InputStreamили IndexRequest.Builderсодержимое для индексации

  • По умолчанию: Добавляет контент в индекс и возвращает его indexId в теле сообщения. Имя целевого индекса можно задать, указав заголовок сообщения с ключом "indexName". IndexId можно задать, указав заголовок сообщения с ключом "indexId".

GetById

  • Тип: Stringили GetRequest.Builderиндекс идентификатора контента для извлечения

  • По умолчанию: Извлекает документ, соответствующий заданному идентификатору индекса, и возвращает объект GetResponse в теле запроса. Имя целевого индекса можно задать, указав заголовок сообщения с ключом "indexName". Тип документа можно задать, указав заголовок сообщения с ключом "documentClass".

Delete

  • Stringили DeleteRequest.Builderиндекс идентификатора удаляемого контента

  • По умолчанию: Удаляет указанный indexName и возвращает объект Result в теле запроса. Имя целевого индекса можно задать, указав заголовок сообщения с ключом "indexName".

DeleteIndex

  • Тип: Stringили DeleteIndexRequest.Builderимя индекса для удаления

  • По умолчанию: Удаляет указанный indexName и возвращает код статуса в теле сообщения. Имя целевого индекса можно задать, указав заголовок сообщения с ключом "indexName".

Bulk Iterableили BulkRequest.Builderлюбого типа, который уже принят (DeleteOperation.Builder для операции удаления, UpdateOperation.Builder для операции обновления, CreateOperation.Builder для операции создания, byte[], InputStream, String, Reader, Map или любой тип документа для операции индексации)

  • Добавляет/обновляет/удаляет содержимое из/в индекс и возвращает объект List<BulkResponseItem> в теле. Вы можете задать имя целевого индекса, задав заголовок сообщения с ключом «indexName».

  • По умолчанию: Search

Map, StringилиSearchRequest.Builder

  • Тип: Поиск по содержимому с помощью карты строки запроса. Имя целевого индекса можно задать, указав заголовок сообщения с ключом "indexName". Количество возвращаемых результатов можно задать, указав заголовок сообщения с ключом "size". Начальное смещение документа можно задать, указав заголовок сообщения с ключом "from".

  • По умолчанию: MultiSearch

MsearchRequest.Builder

  • Множественный поиск в одном

  • По умолчанию: MultiGet

Iterable<String>или MgetRequest.Builderидентификатор документа для извлечения

  • Тип: Несколько попадают в один

    Имя целевого индекса можно задать, задав заголовок сообщения с ключом «indexName».

  • По умолчанию: Exists

None

  • Проверяет, существует ли индекс, и возвращает логический флаг в теле.

    Необходимо задать имя целевого индекса, задав заголовок сообщения с ключом «indexName».

  • По умолчанию: Update

byte[], InputStream, String, Reader, Mapили любой другой тип документа для обновления

  • Тип: Обновляет содержимое по индексу и возвращает indexId содержимого в теле. Имя целевого индекса можно задать, указав заголовок сообщения с ключом "indexName". IndexId можно задать, указав заголовок сообщения с ключом "indexId".

  • По умолчанию: Ping

Configure the component and enable basic authentication

Для использования компонента OpenSearch его необходимо настроить с минимальной конфигурацией.

OpensearchComponent opensearchComponent = new OpensearchComponent();
opensearchComponent.setHostAddresses("opensearch-host:9200");
camelContext.addComponent("opensearch", opensearchComponent);

Для базовой аутентификации с помощью OpenSearch или использования обратного HTTP-прокси перед кластером OpenSearch просто настройте базовую аутентификацию и SSL на компоненте, как показано в примере ниже.

OpenSearchComponent opensearchComponent = new OpenSearchComponent();
opensearchComponent.setHostAddresses("opensearch-host:9200");
opensearchComponent.setUser("opensearchuser");
opensearchComponent.setPassword("secure!!");

camelContext.addComponent("opensearch", opensearchComponent);

Document type

Для всех операций поиска можно указать тип извлекаемого документа, чтобы получить результат, уже не привязанный к ожидаемому типу.

Тип документа можно задать с помощью заголовка «documentClass» или с помощью параметра URI с тем же именем.

Examples

Index Example

Ниже приведен простой пример ИНДЕКСА.

from("direct:index")
  .to("opensearch://opensearch?operation=Index&indexName=twitter");
<route>
    <from uri="direct:index"/>
    <to uri="opensearch://opensearch?operation=Index&amp;indexName=twitter"/>
</route>
  • Тип: * For this operation, you’ll need to specify an indexId header.Для этой операции вам потребуется указать заголовок indexId.

Клиенту достаточно передать сообщение с картой маршрута. Результат содержит созданный indexId.

Map<String, String> map = new HashMap<String, String>();
map.put("content", "test");
String indexId = template.requestBody("direct:index", map, String.class);

Search Example

Для поиска по определённым полям и значениям используйте операцию «Поиск». Передайте запрос в виде строки JSON или карты.

from("direct:search")
  .to("opensearch://opensearch?operation=Search&indexName=twitter");
<route>
    <from uri="direct:search"/>
    <to uri="opensearch://opensearch?operation=Search&amp;indexName=twitter"/>
</route>
String query = "{\"query\":{\"match\":{\"doc.content\":\"new release of ApacheCamel\"}}}";
HitsMetadata<?> response = template.requestBody("direct:search", query, HitsMetadata.class);

Поиск по определенным полям с использованием карты.

Map<String, Object> actualQuery = new HashMap<>();
actualQuery.put("doc.content", "new release of ApacheCamel");

Map<String, Object> match = new HashMap<>();
match.put("match", actualQuery);

Map<String, Object> query = new HashMap<>();
query.put("query", match);
HitsMetadata<?> response = template.requestBody("direct:search", query, HitsMetadata.class);

Воспользуйтесь API прокрутки OpenSearch для поиска всех результатов.

from("direct:search")
  .to("opensearch://opensearch?operation=Search&indexName=twitter&useScroll=true&scrollKeepAliveMs=30000");
<route>
    <from uri="direct:search"/>
    <to uri="opensearch://opensearch?operation=Search&amp;indexName=twitter&amp;useScroll=true&amp;scrollKeepAliveMs=30000"/>
</route>
String query = "{\"query\":{\"match\":{\"doc.content\":\"new release of ApacheCamel\"}}}";
try (OpenSearchScrollRequestIterator response = template.requestBody("direct:search", query, OpenSearchScrollRequestIterator.class)) {
    // do something smart with results
}

Также можно использовать разделенный EIP . (opens in a new tab)

from("direct:search")
  .to("opensearch://opensearch?operation=Search&indexName=twitter&useScroll=true&scrollKeepAliveMs=30000")
  .split()
  .body()
  .streaming()
  .to("mock:output")
  .end();

MultiSearch Example

Для многопоиска по определённым полям и значениям используется операция Operation MultiSearch. Передайте экземпляр MultiSearchRequest.

from("direct:multiSearch")
  .to("opensearch://opensearch?operation=MultiSearch");
<route>
    <from uri="direct:multiSearch"/>
    <to uri="opensearch://opensearch?operation=MultiSearch"/>
</route>

Мультипоиск по определенным полям

MsearchRequest.Builder builder = new MsearchRequest.Builder().index("twitter").searches(
        new RequestItem.Builder().header(new MultisearchHeader.Builder().build())
                .body(new MultisearchBody.Builder().query(b -> b.matchAll(x -> x)).build()).build(),
        new RequestItem.Builder().header(new MultisearchHeader.Builder().build())
                .body(new MultisearchBody.Builder().query(b -> b.matchAll(x -> x)).build()).build());
List<MultiSearchResponseItem<?>> response = template.requestBody("direct:multiSearch", builder, List.class);