1. Введение
Любой, кто использовал Elasticsearch, знает, что построение запросов с использованием API поиска на основе отдыха может быть утомительным и подверженным ошибкам.
В этом руководстве мы рассмотрим Jest, HTTP-клиент Java для Elasticsearch. Однако Elasticsearch предоставляет собственный Java-клиент.Jest предлагает более плавный API и более простой в использовании интерфейс..
2. Зависимости Maven
Первое, что нам нужно сделать, это импортировать библиотеку Jest в наш файл POM:
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>6.3.1</version>
</dependency>
Версия Jest соответствует основному номеру версии Elasticsearch.Это обеспечит совместимость между клиентом и сервером.
Включив зависимость Jest, соответствующая [библиотека Elasticsearch](search.maven.org/search?please=a:…a:elasticsearch) будет включен в качестве транзитивной зависимости.
3. Использование клиента Jest
В этом разделе мы рассмотрим, как использовать клиент Jest для выполнения общих задач в Elasticsearch.
Чтобы использовать клиент Jest, мы просто используемJestClientFactoryСоздаватьJestClientобъект. Эти объекты дороги в создании и потокобезопасны, поэтому мы создадим экземпляр singleton, который можно будет использовать в приложении:
public JestClient jestClient() {
JestClientFactory factory = new JestClientFactory();
factory.setHttpClientConfig(
new HttpClientConfig.Builder("http://localhost:9200")
.multiThreaded(true)
.defaultMaxTotalConnectionPerRoute(2)
.maxTotalConnection(10)
.build());
return factory.getObject();
}
Здесь будет создан клиент Jest, который подключается к Elasticsearch, работающему локально. Хотя этот пример подключения прост,Но Jest также полностью поддерживает прокси, SSL, аутентификацию и даже обнаружение узлов..
JestClientКлассы — это общие классы с несколькими общедоступными методами.Одним из основных методов, который мы будем использовать, является execute, который принимает экземпляр интерфейса Action. Клиент Jest предоставляет несколько классов построителей, помогающих создавать различные операции, взаимодействующие с Elasticsearch.
Результатом всех вызовов Jest является экземпляр JestResult.Мы можем позвонитьissucceededметод проверки на успех. Для неудачных операций мы можем вызватьGetErrorMessageметод, чтобы получить более подробную информацию:
JestResult jestResult = jestClient.execute(new Delete.Builder("1").index("employees").build());
if (jestResult.isSucceeded()) {
System.out.println("Success!");
}
else {
System.out.println("Error: " + jestResult.getErrorMessage());
}
3.1. Управление индексами
Чтобы проверить, существует ли индекс, мы используемIndicatesExistsработать:
JestResult result = jestClient.execute(new IndicesExists.Builder("employees").build())
Для создания индекса мы используемCreateIndexработать:
jestClient.execute(new CreateIndex.Builder("employees").build());
Это создаст индекс с настройками по умолчанию. Мы можем переопределить определенные настройки при создании индекса:
Map<String, Object> settings = new HashMap<>();
settings.put("number_of_shards", 11);
settings.put("number_of_replicas", 2);
jestClient.execute(new CreateIndex.Builder("employees").settings(settings).build());
использоватьModifyAliasesСоздание или изменение псевдонимов также просто:
jestClient.execute(new ModifyAliases.Builder(
new AddAliasMapping.Builder("employees", "e").build()).build());
jestClient.execute(new ModifyAliases.Builder(
new RemoveAliasMapping.Builder("employees", "e").build()).build());
3.2. Создание документации
Клиент Jest позволяет легко индексировать или создавать новые документы, используя классы управления индексами.Документы в Elasticsearch — это просто данные JSON., есть несколько способов передать данные JSON клиенту Jest для индексации.
Для этого примера воспользуемся фиктивным документом сотрудника:
{
"name": "Michael Pratt",
"title": "Java Developer",
"skills": ["java", "spring", "elasticsearch"],
"yearsOfService": 2
}
Первый способ представления документов JSON — использование строк Java. Хотя мы можем создавать строки JSON вручную, мы должны обратить внимание на правильное форматирование, фигурные скобки и экранирующие кавычки. Таким образом, более простой способ — использовать библиотеку JSON (например, Jackson) для создания нашей структуры JSON, а затем преобразовать ее в строку:
ObjectMapper mapper = new ObjectMapper();
JsonNode employeeJsonNode = mapper.createObjectNode()
.put("name", "Michael Pratt")
.put("title", "Java Developer")
.put("yearsOfService", 2)
.set("skills", mapper.createArrayNode()
.add("java")
.add("spring")
.add("elasticsearch"));
jestClient.execute(new Index.Builder(employeeJsonNode.toString()).index("employees").build());
Мы также можем использовать JavaMapдля представления данных JSON и передачи их в операцию индексирования:
Map<String, Object> employeeHashMap = new LinkedHashMap<>();
employeeHashMap.put("name", "Michael Pratt");
employeeHashMap.put("title", "Java Developer");
employeeHashMap.put("yearsOfService", 2);
employeeHashMap.put("skills", Arrays.asList("java", "spring", "elasticsearch"));
jestClient.execute(new Index.Builder(employeeHashMap).index("employees").build());
Наконец, клиент Jest может принять любой POJO, представляющий индексируемый документ. Предположим, у нас есть класс Employee:
public class Employee {
String name;
String title;
List<String> skills;
int yearsOfService;
}
Мы можем передать экземпляр этого класса непосредственно в конструктор индексов:
Employee employee = new Employee();
employee.setName("Michael Pratt");
employee.setTitle("Java Developer");
employee.setYearsOfService(2);
employee.setSkills(Arrays.asList("java", "spring", "elasticsearch"));
jestClient.execute(new Index.Builder(employee).index("employees").build());
3.3 Чтение документов
Существует два основных способа доступа к документам из Elasticsearch с помощью клиента Jest. Во-первых, если мы знаем идентификатор документа, мы можем получить к нему прямой доступ с помощью операции get:
jestClient.execute(new Get.Builder("employees", "17").build());
Чтобы получить доступ к возвращаемому документу, мы должны вызвать один изgetSourceметод. Мы можем получить результат в виде необработанного JSON или десериализовать его в DTO:
Employee getResult = jestClient.execute(new Get.Builder("employees", "1").build())
.getSourceAsObject(Employee.class);
Другой способ доступа к документам — использование поискового запроса, реализованного в Jest через операцию поиска.
Клиент Jest поддерживает полный DSL запросов Elasticsearch.Как и операции индексирования, запросы представлены в виде документов JSON, и существует несколько способов выполнения поиска.
Во-первых, мы можем передать строку JSON, представляющую поисковый запрос. Напоминаем, что мы должны убедиться, что строки правильно экранированы и соответствуют JSON:
String search = "{" +
" \"query\": {" +
" \"bool\": {" +
" \"must\": [" +
" { \"match\": { \"name\": \"Michael Pratt\" }}" +
" ]" +
" }" +
" }" +
"}";
jestClient.execute(new Search.Builder(search).build());
Как и в случае с операцией индексирования выше, мы можем использовать библиотеку, например Jackson, для построения строк запроса JSON. Кроме того, мы также можем использовать собственный API операций запросов Elasticsearch. Одним из недостатков этого является то, что наше приложение должно полагаться на полную библиотеку Elasticsearch.
Мы можем использовать метод getSource для доступа к соответствующим документам в операции поиска. Тем не мение,Jest также предоставляет класс Hit, который упаковывает соответствующий документ и предоставляет метаданные о результате.Используя класс Hit, мы можем получить доступ к дополнительным метаданным для каждого результата: оценка, маршрут и объяснение результата, и это лишь некоторые из них:
List<SearchResult.Hit<Employee, Void>> searchResults =
jestClient.execute(new Search.Builder(search).build())
.getHits(Employee.class);
searchResults.forEach(hit -> {
System.out.println(String.format("Document %s has score %s", hit.id, hit.score));
});
3.4 Обновление документации
Jest предоставляет простую операцию Update для обновления документов:
employee.setYearOfService(3);
jestClient.execute(new Update.Builder(employee).index("employees").id("1").build());
Он принимает то же представление JSON, что и операция индексирования, которую мы видели ранее, что упрощает совместное использование кода между двумя операциями.
3.5 Удаление документов
Удаление документов из индекса осуществляется с помощью операции Delete. Ему просто нужно имя индекса и идентификатор документа:
jestClient.execute(new Delete.Builder("17")
.index("employees")
.build());
4. Пакетные операции
Клиент Jest также поддерживает пакетные операции.Это означает, что мы можем сэкономить время и пропускную способность, отправляя несколько операций одновременно.
Используя массовые операции, мы можем объединить любое количество запросов в один вызов. Мы даже можем комбинировать разные типы запросов:
jestClient.execute(new Bulk.Builder()
.defaultIndex("employees")
.addAction(new Index.Builder(employeeObject1).build())
.addAction(new Index.Builder(employeeObject2).build())
.addAction(new Delete.Builder("17").build())
.build());
5. Асинхронные операции
Клиент Jest также поддерживает асинхронные операции.Это означает, что мы можем выполнять любую из вышеперечисленных операций, используя неблокирующий ввод-вывод.
Чтобы вызвать операцию асинхронно, просто используйтеexecuteAsyncметод:
jestClient.executeAsync(
new Index.Builder(employeeObject1).build(),
new JestResultHandler<JestResult>() {
@Override public void completed(JestResult result) {
// handle result
}
@Override public void failed(Exception ex) {
// handle exception
}
});
Обратите внимание, что в дополнение к операциям (в данном случае индексации) асинхронные потоки требуютJestResultHandler. Этот объект будет вызываться клиентом Jest после завершения операции. Интерфейс имеет два метода — Complete и Fail — которые позволяют обрабатывать успех или неудачу операции соответственно.
6. Заключение
В этом руководстве мы кратко представили клиент Jest, Java-клиент RESTful для Elasticsearch. Хотя мы рассмотрели лишь небольшую часть его функций, ясно, что Jest — надежный клиент Elasticsearch. Его беглые классы компоновщика и интерфейс RESTful облегчают изучение, а его полная поддержка интерфейса Elasticsearch делает его сильной альтернативой собственным клиентам.
Как всегда, все примеры кода в этом руководстве находятся в нашемСтраница на гитхабеначальство.
оригинал:Woohoo. Положите арлингтон-терьер.com/elastic это ухо…
автор:Michael Pratt
Переводчик:huowolf/