Как указать ключ маршрутизации в spring data elasticsearch во время индексирования.
Я создал приложение для весенней загрузки, которое использует данные spring elasticsearch для индексации документов.
Ниже представлена моя структура документа (без геттеров-сеттеров).
@Document(indexName = Constants.ES_INDEX_NAME, type = Constants.ES_TYPE,createIndex = false)
public class EsDocument {
@Id
private String ID;
private String group;
private String request;
private String response;
private Filters filters;
public EsDocument() {
}
}
public class Filters {
private String order_id;
private String api_type;
private int status;
private String statusCode;
private String createdAt;
}
Это код для индексации документа. Я использую ElasticSearchTemplate для индексации своих данных.
public void saveAll(List<EsDocument> esDocuments) {
List<IndexQuery> queries = new ArrayList<>();
for(EsDocument esDocument : esDocuments) {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setObject(esDocument);
indexQuery.setIndexName(esDocument.getGroup());
queries.add(indexQuery);
}
if (queries.size() > 0) {
elasticsearchTemplate.bulkIndex(queries);
}
logger.info("Batch Documents Saved to elastic search");
}
Как теперь добавить настраиваемый ключ маршрутизации при индексировании ?. Я хочу добавить filter.order_id в качестве ключа маршрутизации во время индексации.
В AFAIK ElasticsearchTemplate отсутствует поддержка маршрутизации в определенных областях, и вам нужно перейти к клиенту, чтобы предоставить необходимую информацию о маршрутизации.
Попробуйте что-нибудь вроде
Client client = elasticsearchTemplate.getClient();
IndexRequestBuilder builder = client.prepareIndex(...);
builder.setRouting(...);
Это то, что я выяснил с BulkOptions и IndexCoordinates при использовании метода bulkIndex шаблона Elasticsearch. Пожалуйста, найдите полный код ниже:
public void indexAllData(final List<MediaResourceEsDto> mediaResources, final String indexName, final String routingId) {
final List<IndexQuery> queries = new ArrayList<>();
for(final MediaResourceEsDto mediaResource : mediaResources) {
final IndexQuery indexQuery = new IndexQuery();
indexQuery.setObject(mediaResource);
queries.add(indexQuery);
}
// set index name
final IndexCoordinates indexCoordinates = IndexCoordinates.of(indexName);
// set routing id
final BulkOptions.BulkOptionsBuilder bulkOptionsBuilder = BulkOptions.builder();
bulkOptionsBuilder.withRoutingId(routingId);
final BulkOptions bulkOptions = bulkOptionsBuilder.build();
if (queries.size() > 0) {
elasticsearchTemplate.bulkIndex(queries, bulkOptions, indexCoordinates);
}
}
Поскольку у меня уже есть данные в списке, который я отсортировал из базы данных, я просто передаю их методу:
indexAllData(mediaResourceList, "media_resource_index_2", "kaufland");
Надеюсь, это кому-то поможет.
Ваше здоровье :)
Немного информации об окружающей среде:
spring-data-elasticsearch: 4.0.0.RELEASE (самая последняя версия на сегодняшний день)
spring -boot: 2.3.0.RELEASE (самая последняя версия на сегодняшний день)