如何在索引编制期间在spring数据elasticsearch中指定路由键。
我制作了一个spring boot应用程序,它使用spring数据elasticsearch来索引文档。
下面是我的文档结构(没有getter setters)。
@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");
}
现在如何在索引编制过程中添加自定义路由密钥?我想在索引编制过程中添加 filters.order_id 作为我的路由键。
答案 0 :(得分:0)
AFAIK ElasticsearchTemplate在某些区域缺少对路由的支持,您必须转到客户端以提供必要的路由信息。
尝试一下
的内容Client client = elasticsearchTemplate.getClient();
IndexRequestBuilder builder = client.prepareIndex(...);
builder.setRouting(...);
答案 1 :(得分:0)
这就是我在使用Elasticsearch Template的BulkOptions
方法时使用IndexCoordinates
和bulkIndex
得出的结果。请在下面找到完整的代码:
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(今天是最新版本)