Как мы все знаем, в elasticsearch есть индексы, которые вы можете запрашивать для получения данных. Это просто с настроенными данными spring или шаблоном rest. Итак, я наткнулся на сложный запрос, который мне нужно выполнить. Так что давайте посмотрим. Запрос, который я должен был выполнить по двум пользовательским индексам разных типов, имеющим некоторые схожие данные. Поэтому я провел некоторые исследования и разработки и узнал о нескольких поисковых запросах. Запросы с несколькими поисковыми запросами позволяют нам запрашивать два или более индекса с запросами для каждого индекса. Ознакомьтесь по ссылке ниже https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-multi-search.html
Решение, предоставленное API множественного поиска, было хорошим, но сложным для моего случая, так как у меня были разные индексы, но с одинаковыми полями в обоих, такими как идентификатор пользователя, идентификатор, имя. Поэтому я использую несколько индексов, но с одним поиском и одним запросом. Дай посмотреть.
1.Создайте метод и инициализируйте высокоуровневый клиент Rest (вы также можете использовать его непосредственно в своем основном методе, я просто предпочитаю хранить отдельный код)
private RestHighLevelClient restHighLevelClient() { log.debug("RestHighLevelClient initialization"); String esHost = // host of elasticsearch Integer esPort = // port of elasticsearch return new RestHighLevelClient(RestClient.builder(new HttpHost(esHost, esPort))); }
2.Метод поиска с помощью запроса
search(keyword: string) { // Create a Bool query BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(query); // Create a search request // pass your indexes in place of indexA, indexB SearchRequest searchRequest = new SearchRequest("indexA", "indexB"); // CReate a search Source SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(boolQuery); searchRequest.source(searchSourceBuilder); // Create object to get Response SearchResponse searchResponse = restHighLevelClient().search(searchRequest, RequestOptions.DEFAULT); // Parsing response SearchHit[] searchHits = searchResponse.getHits().getHits(); }
3.Анализ данных из поиска с помощью цикла Просто передайте поля и приведите тип данных, чтобы получить ожидаемый ответ
for(SearchHit hit: searchHits) { MapsourceAsMap = hit.getSourceAsMap(); String field = (String) sourceAsMap.get("fieldName"); Integer field2 = (Integer) sourceAsMap.get("fieldName"); }
4.Вот как вы можете выполнить множественный поиск. Просто замените свой запрос, индексы по мере необходимости и проанализируйте данные
Примечание: Вы, должно быть, думаете о том, почему мы не использовали их вместо этого. Это связано с тем, что на данный момент нам требуется всего 3 поля, с которыми можно легко справиться. Для этого мы используем JSONObject. Вы можете создать любой класс или DTO для синтаксического анализа.
Я надеюсь, что это поможет вам, спасибо за чтение.
Кроме того, проверьте Tekraze.com для получения дополнительных статей.
Оригинал: “https://dev.to/balvinder294/how-to-query-multiple-indexes-with-elasticsearch-in-spring-boot-java-app-1ope”