Spring Data访问Elasticsearch----路由值Routing values

Spring Data访问Elasticsearch----路由值Routing values


当Elasticsearch将文档存储在具有多个分片的索引中时,它会根据文档的id确定要使用的分片。有时有必要预先定义多个文档应该在同一个shard上建立索引(join-types,更快地搜索相关数据)。为此,Elasticsearch提供了定义路由的可能性,路由是用于计算shard的值,而不是id。
Spring Data Elasticsearch通过以下方式支持存储和检索数据的路由定义:

一、join-types的路由

当使用联接类型(请参阅联接类型实现)时,Spring Data Elasticsearch将自动使用实体的JoinField属性的parent属性作为路由的值。
这对于parent-child关系只有一个级别的所有用例都是正确的。如果是更深层次的,比如child-parent-grandparent的关系——比如之前的例子vote → answer → question-然后需要使用下一节中描述的技术明确指定路由(投票需要question.id作为路由值)。

二、自定义路由值

为了定义一个实体的自定义路由,Spring Data Elasticsearch提供了一个@Routing注解(重用之前的Statement类):

@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属性。然后,此属性的值将用作使用该实体的所有请求的路由值。
我们也可以在@Document注解中使用SpEL表达式,如下所示:

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

在这种情况下,用户需要提供一个名为myBean的bean,该bean具有String getRouting(Object)方法。要引用实体,必须在SpEL表达式中使用“#entity”,并且返回值必须为null或路由值为String。
如果普通属性的名称和SpEL表达式不足以自定义路由定义,则可以定义并提供RoutingResolver接口的实现。然后可以在ElasticOperations实例上设置:

RoutingResolver resolver = ...;

ElasticsearchOperations customOperations= operations.withRouting(resolver);

withRouting()函数返回带有自定义路由集的原始ElasticsearchOperations实例的副本。
当路由存储在Elasticsearch中时,在实体上定义了路由时,在执行get或delete操作时必须提供相同的值。对于不使用实体(如get(ID)或delete(ID))的方法,ElasticsearchOperations.withRouting(RoutingResolver)方法可以这样使用:

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

相关推荐

  1. Spring Data访问Elasticsearch----Routing values

    2024-03-20 07:12:04       22 阅读
  2. Elasticsearch索引数据的规则与自定义分发

    2024-03-20 07:12:04       12 阅读
  3. Elasticsearch搜索优化-自定义规划(routing)

    2024-03-20 07:12:04       10 阅读
  4. Vue-router的动态:获取传递的

    2024-03-20 07:12:04       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 07:12:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 07:12:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 07:12:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 07:12:04       20 阅读

热门阅读

  1. kafka connect

    2024-03-20 07:12:04       19 阅读
  2. C# double类型计算精度问题解决

    2024-03-20 07:12:04       21 阅读
  3. 面试复盘(北京某小公司)

    2024-03-20 07:12:04       21 阅读
  4. Unity构建详解(2)——SBP的初始设置和脚本编译

    2024-03-20 07:12:04       16 阅读
  5. windows搭建Elasticsearch环境

    2024-03-20 07:12:04       22 阅读
  6. Openssh

    2024-03-20 07:12:04       18 阅读
  7. [论文笔记] Open-Sora 4、sora复现训练过程 (新repo)

    2024-03-20 07:12:04       20 阅读
  8. OpenCV 单目相机光平面标定

    2024-03-20 07:12:04       23 阅读
  9. 【ML】深度学习演进与神经网络反向传播推导 2

    2024-03-20 07:12:04       17 阅读