Плагин Elasticsearch для Para
Para был разработан как простая и модульная средняя структура для устойчивости объекта и поиска. Это позволяет вашему приложению хранить объекты непосредственно в хранилище данных (NOSQL) или в любую реляционную базу данных (RDBMS), а также автоматически индексирует эти объекты и делает их доступными для поиска.
Этот плагин позволяет использовать Elasticsearch в качестве поисковой системы для пара.
Search , используя официальный клиент Elasticsearch Java/v1/_elasticsearch - ретрансляции все запросы непосредственно в Elasticsearch (по умолчанию отключено)| ES плагин версия | Elasticsearch Support | Поддержка OpenSearch |
|---|---|---|
1.40.0 и выше | 8.x и выше (с флагом конфигурации) | 1.0.0 и выше (с флагом конфигурации) |
1.39.0 и ниже | до 7.15.2 | 1.0.0 и выше |
После версии 1.40.0 флаг конфигурации необходим для определения двух разных вкусов Eleasticsearch:
para.es.flavor = " elasticsearch "
# ==== OR ==== #
para.es.flavor = " opensearch " Вариант по умолчанию здесь - elasticsearch .
Плагин находится на Maven Central. Вот фрагмент Maven, чтобы включить в свой pom.xml :
< dependency >
< groupId >com.erudika</ groupId >
< artifactId >para-search-elasticsearch</ artifactId >
< version >{see_green_version_badge_above}</ version >
</ dependency > В качестве альтернативы вы можете загрузить JAR с вкладки «Выпуски» выше. Поместите его в папку lib вместе с серверным файлом войны para-xyzwar . PARA будет искать плагины внутри lib и забрать плагин Elasticsearch.
Вот все свойства конфигурации для этого плагина (они заходят внутри вашего application.conf ):
# ES flavor - elasticsearch or opensearch
para.es.flavor = " elasticsearch "
# enable this to bypass the DB and read all data straight from ES
para.read_from_index = false
para.es.shards = 5
para.es.replicas = 0
para.es.dir = " data "
para.es.auto_expand_replicas = " 0-1 "
para.es.restclient_scheme = " http "
para.es.restclient_host = " localhost "
para.es.restclient_port = 9200
# context path of elasticsearch e.g. /es
para.es.restclient_context_path = " "
para.es.sign_requests_to_aws = false
para.es.aws_region = " eu-west-1 "
para.es.fail_on_indexing_errors = false
para.es.track_total_hits = 10000
# if login and password are filled then add for each request
# the Authorization header with basic auth
para.es.basic_auth_login = " "
para.es.basic_auth_password = " "
# asynchronous settings
para.es.async_enabled = false
para.es.bulk.size_limit_mb = 5
para.es.bulk.action_limit = 1000
para.es.bulk.concurrent_requests = 1
para.es.bulk.flush_interval_ms = 5000
para.es.bulk.backoff_initial_delay_ms = 50
para.es.bulk.max_num_retries = 8
para.es.bulk.flush_immediately = false
# proxy settings
para.es.proxy_enabled = false
para.es.proxy_path = " _elasticsearch "
para.es.proxy_reindexing_enabled = falseНаконец, установите свойство конфигурации:
para.search = "ElasticSearch"
Это может быть свойство системы Java или часть файла application.conf на классе. Это говорит Para использовать реализацию Elasticsearch вместо дефолта (Lucene).
Новые версии ES используют HTTPS по умолчанию и генерируют уникальный SSL -сертификат при первом запуске. Чтобы иметь успешное соединение, вы должны сначала добавить сгенерированное CA сервера ES в свой магазин ключей Java, указывая на то, что вы доверяете этому сертификату. Это консольная команда для этого:
echo -n |
openssl s_client -connect localhost:9200 |
sed -ne ' /-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p ' > ./ca_elasticsearch.cer &&
keytool -import -alias saelk -file ca_elasticsearch.cer -keystore ${JAVA_HOME} /lib/security/cacerts -storepass changeit Наконец, установите para.es.restclient_scheme = "https" .
Плагин Elasticsearch поддерживает как синхронные (по умолчанию), так и асинхронные режимы индексации. Для синхронной индексации плагин Elasticsearch сделает один запрос на блокировку через клиента и ждат ответа. Это означает, что каждая операция документа (Index, Reindex или Delete) вызывает новый запрос клиента. Для определенных приложений это может вызвать тяжелую нагрузку на кластер Elasticsearch. Преимущество синхронной индексации, однако, является результат запроса, который может быть передан обратно в клиентскую приложение. Если настройка para.es.fail_on_indexing_errors установлен на true , синхронные запросы, которые приводят к ошибке, распространятся обратно в клиентское приложение с кодом ошибки HTTP.
В режиме асинхронного индексации используется BulkProcessor Elasticsearch для передачи всех запросов в кластер Elasticsearch. Если асинхронный режим включен, все запросы документов будут поданы в объемный процессор, который иногда будет промывать запросы на кластер. Существует несколько настраиваемых параметров для управления частотой промывки на основе количества документов, общего размера документа (MB) и общей продолжительности (MS). Поскольку Elasticsearch разработана как поисковая система почти в реальном времени, настоятельно рекомендуется асинхронный режим. Создание случайных, больших партий запросов документов поможет уменьшить нагрузку на кластер Elasticsearch.
Режим асинхронного индексации также предлагает привлекательную функцию для автоматической повторной повторной проверки запросов на индексацию. Если ваш кластер Elasticsearch находится под тяжелой нагрузкой, возможно, запрос индексации новых документов может быть отклонен. С синхронной индексацией бремя падает на клиентское приложение, чтобы снова попробовать запрос на индексацию. Однако Elasticsearch Bulkprocessor предлагает полезную функцию для автоматической повторной повторной индексации с экспоненциальным отбором между RESRIES. Если запрос индекса не выполняется с помощью EsRejectedExecutionException , запрос будет повторно подключен к para.es.bulk.max_num_retries Times. Даже если ваш вариант использования требует высокой степени доверия в отношении согласованности данных между вашей базой данных ( DAO ) и индексом ( Search ), все еще рекомендуется использовать асинхронную индексацию с включенными RESRIES. Если вы предпочитаете использовать асинхронную индексацию, но прочитываете объемный процессор при каждом вызове индекса/unindex/indexall/unindexall, просто включен para.es.bulk.flush_immediately . Когда эта опция включена, метод промывки BulkProcessor будет вызоваться сразу после добавления документов в запрос. Этот вариант также полезен для написания модульных тестов, где вы хотите убедиться, что документы быстро промывают.
Этот плагин имеет два режима индексации: нормальный и вложенный . Вложенный режим был добавлен после V1.28 для защиты от возможного картирования, который происходит, когда в них есть много объектов с множеством различных пользовательских свойств. Это перегружает метаданные индекса Elasticsearch Index и может сбить весь кластер. Этот режим индексации влияет только на пользовательские свойства в объектах Sysprop .
Старый «нормальный» режим подходит для большинства развертываний PARA, с лишь несколькими арендаторами или одним арендатором (одно приложение на сервер). В этом режиме объекты Para индексируются без модификации (все типы данных сохраняются), но это может привести к картированию.
Вложенная структура данных для этих двух режимов индексации показана ниже:
// NORMAL MODE // NESTED MODE
{ {
"id": "123", "id": "123",
"appid": "para", "appid": "para",
"type": "custom", "type": "custom",
"properties": { "properties": [
"key1": "value1", {"k": "key1", "v": "value1"},
"key2": { {"k": "key2-subkey1", "v": "subValue1"},
"subkey1": "subValue1" {"k": "numericKey3", "vn": 5}
}, ],
"numericKey3": 5 "_properties": "{"key1":"value1"}..."
} }
}
Переключение в новый вложенный режим индексации осуществляется со свойством конфигурации:
para.es.es.use_nested_custom_fields = true
Еще одним преимуществом, при использовании «вложенного» режима, является поддержка вложенных запросов в строках запросов. Это действительно полезная функция, которая на момент написания этого не была реализована в Elasticsearch (выпуск Elastic/Elasticsearch#11322). Более того, вы можете запросить объекты в пределах вложенных массивов с точностью точной точки, например ?q=properties.nestedArray[2].key:value Вложенный запрос строки запроса обнаруживается, если он содержит поле со properties.* . Примеры запросов запросов строки:
/v1/search?q=term AND properties.owner.age:[* TO 34]
/v1/search?q=properties.owner.name:alice OR properties.owner.pets[1].name=whiskers
Примечание. Сортировка на вложенных полях работает только с числовыми данными. Например, сортировка на полевых properties.year Yeear будет работать, но сортировка на properties.month Монт не будет (применимо только к режиму «вложенного»).
Вы можете напрямую позвонить в API Elasticsearch через /v1/_elasticsearch . Чтобы включить его установить para.es.proxy_enabled = true первым. Затем вы должны указать параметр path , соответствующий пути ресурса Elasticsearch API. Это делается для каждого GET , PUT , POST , PATCH или DELETE запрос на Elasticsearch. Конечная точка принимает запрос на либо /v1/_elasticsearch , либо /v1/_elasticsearch/{path} , где path -это параметр, кодируемый URL. Не добавляйте параметры запроса в путь запроса ? Вместо этого пропустите их в виде карты параметров.
GET /v1/_elasticsearch/_search
GET /v1/_elasticsearch/mytype%2f_search
DELETE /v1/_elasticsearch/tweet%2f1
ParaClient пример:
Response get = paraClient . invokeGet ( "_elasticsearch/" + Utils . urlEncode ( "tweet/_search" ), params );
Response post = paraClient . invokePost ( "_elasticsearch/_count" ,
Entity . json ( Collections . singletonMap ( "query" ,
Collections . singletonMap ( "term" ,
Collections . singletonMap ( "type" , "cat" ))))); Если параметр path опущена, он по умолчанию в _search .
Объект ответа будет преобразован, чтобы быть совместимым с клиентами PARA.
{
"page" : 0 ,
"totalHits" : 3 ,
"items" : [ { ... } ]
} Если вы хотите получить необработанный ответ запроса от Elasticsearch, добавьте параметр getRawResponse=true в путь к пробегу, а также URL-кодируйте его:
GET /v1/_elasticsearch/mytype%2f_search%3FgetRawResponse%3Dtrue
Эквивалентно, то же самое можно сделать, добавив параметр запроса, используя ParaClient :
MultivaluedHashMap<String, String> params = new MultivaluedHashMap<>();
params.putSingle("getRawRequest", "true");
paraClient.invokeGet("_elasticsearch/" + Utils.urlEncode("mytype/_search"), params);
ПРИМЕЧАНИЕ. Эта конечная точка требует аутентификации, и запросы без знака не допускаются. Имейте в виду, что все запросы на Elasticsearch префикслены идентификатором приложения. Например, если идентификатор приложения является «App: MyApp, то PARA будет прокси -запросы на ElasticSearch по http://eshost:9200/myapp/{path} .
Вы можете восстановить весь индекс приложений с нуля, позвонив по POST /v1/_elasticsearch/reindex . Чтобы включить его установить para.es.proxy_reindexing_enabled = true сначала. Эта операция выполняет ElasticSearchUtils.rebuildIndex() внутри и возвращает ответ, указывающий количество объектов реиндексированного и истешенное время:
{
"reindexed": 154,
"tookMillis": 365
}
Кроме того, вы можете указать индекс назначения в реиндекс, который должен быть создан заранее:
POST /v1/_elasticsearch/reindex?destinationIndex=yourCustomIndex
Плагин также поддерживает обмен индексом, в результате чего индекс Root App используется с другими приложениями, которые создаются с помощью флага app.isSharingIndex = true . Эта функция включена с para.es.root_index_sharing_enabled = true , и по умолчанию она выключена. Когда корневой индекс создается с включенным обменом, для него создается специальный псевдоним, который содержит поле маршрутизации, которое отправляет все документы детского приложения в конкретный осколок, обеспечивая полную изоляцию между приложениями. Это полезно, когда есть много небольших приложений с несколькими сотнями документов, и мы хотим избежать накладных расходов одного индекса на приложение.
IndexBasedDAO был удален, потому что у него было много проблем.Apache 2.0