如何在索引期间在spring数据elasticsearch中指定路由键。

时间:2018-06-05 11:50:05

标签: spring spring-boot elasticsearch routing spring-data-elasticsearch

如何在索引编制期间在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 作为我的路由键。

2 个答案:

答案 0 :(得分:0)

AFAIK ElasticsearchTemplate在某些区域缺少对路由的支持,您必须转到客户端以提供必要的路由信息​​。

尝试一下

的内容
Client client = elasticsearchTemplate.getClient();
IndexRequestBuilder builder = client.prepareIndex(...);
builder.setRouting(...);

答案 1 :(得分:0)

这就是我在使用Elasticsearch Template的BulkOptions方法时使用IndexCoordinatesbulkIndex得出的结果。请在下面找到完整的代码:

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(今天是最新版本)