原标题:Spring认证中国教育管理中心-Spring Data Elasticsearch教程六(Spring中国教育管理中心)
12. 路由值
当 Elasticsearch 将文档存储在具有多个分片的索引中时,它会根据文档的id确定要使用的分片。有时需要预先定义多个文档应该在同一个分片上建立索引(连接类型,更快地搜索相关数据)。为此,Elasticsearch 提供了定义路由的可能性,这是应该用于计算分片而不是id的值。
Spring Data Elasticsearch 支持通过以下方式存储和检索数据的路由定义:
12.1.连接类型的路由
当使用 join-types(见Join-Type implementation)时,Spring Data Elasticsearch 将自动使用parent实体属性的JoinField属性作为路由的值。
这对于父子关系只有一个级别的所有用例都是正确的。如果它更深一些,比如孩子-父母-祖父母的关系——就像上面的例子中的投票→回答→问题——那么需要使用下一节中描述的技术来明确指定路由(投票需要question.id作为路由值)。
12.2.自定义路由值
为了为实体定义自定义路由,Spring Data Elasticsearch 提供了一个@Routing注解(重用Statement上面的类):
@Document(indexName = "statements")
@Routing("routing")
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;
// getter/setter...
}
这将“路由”定义为路由规范
一个名为routing的属性
如果routing注解的规范是纯字符串而不是 SpEL 表达式,则将其解释为实体的属性名称,在示例中为路由属性。然后,此属性的值将用作使用该实体的所有请求的路由值。
我们也可以在@Document注释中使用 SpEL 表达式,如下所示:
@Document(indexName = "statements")
@Routing("@myBean.getRouting(#entity)")
public class