最新的稳定版本请使用 Spring Data Elasticsearch 5.3.1Spring中文文档

最新的稳定版本请使用 Spring Data Elasticsearch 5.3.1Spring中文文档

当 Elasticsearch 将文档存储在具有多个分片的索引中时,它会根据文档的 ID 确定要使用的分片。 有时需要预定义应在同一分片上为多个文档编制索引(联接类型,更快地搜索相关数据)。 为此,Elasticsearch 提供了定义路由的可能性,该路由是用于计算分片而不是 id 的值。Spring中文文档

Spring Data Elasticsearch通过以下方式支持存储和检索数据的路由定义:Spring中文文档

连接类型的路由

使用连接类型(请参阅连接类型实现)时,Spring Data Elasticsearch 将自动使用实体属性的属性作为路由的值。parentJoinFieldSpring中文文档

这对于父子关系只有一个级别的所有用例都是正确的。 如果它更深,比如孩子-父母-祖父母的关系 - 就像上面的投票→→回答问题的例子一样 - 那么路由需要使用下一节中描述的技术明确指定(投票需要 question.id 作为路由值)。Spring中文文档

自定义路由值

为了定义实体的自定义路由,Spring Data Elasticsearch 提供了一个注解(重用上面的类):@RoutingStatementSpring中文文档

@Document(indexName = "statements")
@Routing("routing")                  (1)
public class Statement {
    @Id
    private String id;

    @Field(type = FieldType.Text)
    private String text;

    @JoinTypeRelations(
        relations =
            {
                @JoinTypeRelation(parent = "question", children = {"answer", "comment"}),
                @JoinTypeRelation(parent = "answer", children = "vote")
            }
    )
    private JoinField<String> relation;

    @Nullable
    @Field(type = FieldType.Keyword)
    private String routing;          (2)

    // getter/setter...
}
1 这将“路由”定义为路由规范
2 名称为 routing 的属性

如果批注的规范是纯字符串而不是 SpEL 表达式,则将其解释为实体属性的名称,在本例中为 routing 属性。 然后,此属性的值将用作使用该实体的所有请求的路由值。routingSpring中文文档

我们也可以在注解中使用 SpEL 表达式,如下所示:@DocumentSpring中文文档

@Document(indexName = "statements")
@Routing("@myBean.getRouting(#entity)")
public class Statement{
    // all the needed stuff
}

在这种情况下,用户需要提供一个名为 myBean 的 Bean,该 Bean 具有 方法 。若要引用实体,必须在 SpEL 表达式中使用“#entity”,并且返回值必须为 或路由值为 String。String getRouting(Object)nullSpring中文文档

如果纯属性的名称和 SpEL 表达式不足以自定义路由定义,则可以定义提供接口的实现。然后,可以在实例上设置此项:RoutingResolverElasticOperationsSpring中文文档

RoutingResolver resolver = ...;

ElasticsearchOperations customOperations= operations.withRouting(resolver);

这些函数返回具有自定义路由集的原始实例的副本。withRouting()ElasticsearchOperationsSpring中文文档

如果在实体中存储了路由,则在执行获取删除操作时必须提供相同的值。对于不使用实体的方法(如 或),该方法可以像这样使用:get(ID)delete(ID)ElasticsearchOperations.withRouting(RoutingResolver)Spring中文文档

String id = "someId";
String routing = "theRoutingValue";

// get an entity
Statement s = operations
                .withRouting(RoutingResolver.just(routing))       (1)
                .get(id, Statement.class);

// delete an entity
operations.withRouting(RoutingResolver.just(routing)).delete(id);
1 RoutingResolver.just(s)返回一个解析器,该解析器将只返回给定的 String。
1 这将“路由”定义为路由规范
2 名称为 routing 的属性
1 RoutingResolver.just(s)返回一个解析器,该解析器将只返回给定的 String。