该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用Spring Data Elasticsearch 5.5.5spring-doc.cadn.net.cn

路由值

当Elasticsearch将文档存储在包含多个分片的索引中时,它会根据文档的ID决定你要使用的分片。 有时需要预先定义多个文档应在同一分片上进行索引(连接类型,更快搜索相关数据)。 为此,Elasticsearch 提供了定义路由(routing)的可能性,路由是应用来计算分片的值,而不是 idspring-doc.cadn.net.cn

Spring Data Elasticsearch 支持以下方式的存储和检索数据路由定义:spring-doc.cadn.net.cn

连接类型的路由

当使用连接类型(参见连接类型实现)时,Spring Data Elasticsearch 会自动使用父母实体的财产乔因菲尔德财产作为路由的价值。spring-doc.cadn.net.cn

这适用于所有亲子关系只有一层的用例。 如果关系更深,比如父母与祖父母的关系——如上面投票→回答问题中的例子——那么路由需要通过下一节描述的技术明确指定(投票需要 question.id 作为路由值)。spring-doc.cadn.net.cn

自定义路由值

为了定义实体的自定义路由,Spring Data Elasticsearch 提供了@Routing注释(重复使用陈述上级:spring-doc.cadn.net.cn

@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 表达式,它被解释为实体属性的名称,在示例中是路由属性。 该属性的值将作为所有使用该实体请求的路由值。spring-doc.cadn.net.cn

也可以在@Document注释如下:spring-doc.cadn.net.cn

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

此时用户需要提供名为myBean的Bean,并带有方法。字符串 getRouting(Object).引用实体时必须在 SpEL 表达式中使用“#entity”,返回值必须为或者路由值作为字符串。spring-doc.cadn.net.cn

如果纯属性的名称和 SpEL 表达式不足以自定义路由定义,也可以定义 提供路由解析器接口。此时可以设置为弹性作实例:spring-doc.cadn.net.cn

RoutingResolver resolver = ...;

ElasticsearchOperations customOperations= operations.withRouting(resolver);

withRouting()函数返回原始副本弹性搜索作使用自定义路由集的实例。spring-doc.cadn.net.cn

当在实体中定义路由并存储在 Elasticsearch 时,执行获取删除作时必须提供相同的值。对于不使用实体的方法——比如get(ID)delete(ID)-这ElasticsearchOperations.withRouting(RoutingResolver)方法可采用如下:spring-doc.cadn.net.cn

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)返回一个解析器,只返回给定的字符串。