Elasticsearch 8 支持别名查询

在 Elasticsearch 8 中,使用 Java 高级 REST 客户端进行别名管理的过程与之前的版本类似,但有一些API细节上的变化。以下是如何使用 Java 和 Elasticsearch 8 进行别名操作的例子:

引入依赖

确保你的项目中包含了 Elasticsearch 的高级 REST 客户端依赖。对于 Maven,你可能需要如下依赖:

 

Xml

深色版本

1<dependency>
2    <groupId>org.elasticsearch.client</groupId>
3    <artifactId>elasticsearch-rest-high-level-client</artifactId>
4    <version>8.0.0</version>
5</dependency>

创建索引

首先,你需要创建一个新的索引:

 

Java

深色版本

1import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
2import org.elasticsearch.client.RequestOptions;
3import org.elasticsearch.client.RestHighLevelClient;
4
5RestHighLevelClient client = new RestHighLevelClient(...);
6CreateIndexRequest request = new CreateIndexRequest("new_index");
7client.indices().create(request, RequestOptions.DEFAULT);

定义别名

接着,定义一个别名并将其关联到你的新索引上:

 

Java

深色版本

1import org.elasticsearch.action.admin.indices.alias.put.Alias;
2import org.elasticsearch.action.admin.indices.alias.put.PutAliasRequest;
3
4PutAliasRequest aliasRequest = new PutAliasRequest("new_index").alias("my_alias");
5client.indices().putAlias(aliasRequest, RequestOptions.DEFAULT);

重定向别名

当你准备好将流量从旧索引重定向到新索引时,可以先删除旧索引上的别名,然后再将别名添加到新索引上:

 

Java

深色版本

1import org.elasticsearch.action.admin.indices.alias.delete.DeleteAliasesRequest;
2
3DeleteAliasesRequest deleteRequest = new DeleteAliasesRequest();
4deleteRequest.indices("old_index");
5deleteRequest.aliases("my_alias");
6client.indices().deleteAlias(deleteRequest, RequestOptions.DEFAULT);
7
8// 然后将别名添加到新索引上
9aliasRequest = new PutAliasRequest("new_index").alias("my_alias");
10client.indices().putAlias(aliasRequest, RequestOptions.DEFAULT);

数据写入

当别名被正确设置后,你的应用程序只需要向别名发送写入请求,而不需要关心实际的索引名称:

 

Java

深色版本

1import org.elasticsearch.action.index.IndexRequest;
2import org.elasticsearch.common.xcontent.XContentType;
3
4IndexRequest indexRequest = new IndexRequest("my_alias")
5    .source(jsonString, XContentType.JSON);
6client.index(indexRequest, RequestOptions.DEFAULT);

注意事项

  • 在删除旧别名和添加新别名的过程中,确实存在一个短暂的时间窗口,在此期间,查询可能无法找到数据。为了减小这种影响,你可以使用 Elasticsearch 的 indices.put_alias API 中的 wait_for_active_shards 参数来等待所有分片变为活动状态后再继续下一步操作。
  • 在生产环境中,确保在进行切换前对新索引进行了充分的测试,确保其设置正确,且数据导入已完成。
  • 监控别名操作的状态,确保没有出现异常情况。

------------------------------------------------------------------------

查看别名

GET /_aliases

GET /_alias/content_erp_nlp_help_alia

在 Elasticsearch 中,当你使用别名进行查询时,实际上的流程是这样的:

  1. 解析别名: 当你向 Elasticsearch 发送一个请求,其中包含别名而不是具体的索引名称时,Elasticsearch 会首先解析这个别名,找出所有与该别名相关的实际索引。

  2. 转发请求: 解析出实际的索引后,Elasticsearch 会将查询请求转发到这些索引上。这意味着,如果你的别名指向了多个索引,查询将会同时在这些索引上执行。

  3. 收集和汇总结果: 每个被查询的索引都会返回自己的结果集。Elasticsearch 会收集这些结果,并将它们汇总在一起,形成一个统一的响应返回给客户端。

  4. 返回结果: 最终,客户端接收到的查询结果看起来就像是从一个单一的索引获得的一样,尽管实际上可能涉及到了多个索引。

因此,当你使用别名查询时,Elasticsearch 的内部机制是将这个查询转换为对多个具体索引的查询,然后处理这些索引的结果,以提供一个统一的视图。这种方式使得维护和查询多个逻辑相关的索引变得更为方便,特别是当涉及到滚动更新或索引重构时,别名可以作为稳定的入口点,而不会影响到使用这些别名的应用程序。

别名变更

// 创建索引
    @Test
    public void createIndex(){
        try {
            esService.createIndex(ES_INDEX_NAME);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 指定模板
    @Test
    public void createIndexAndTemp(){
        try {
            int status = esService.createIndexTemp(ES_INDEX_TEMP_NAME);
            System.out.println(status);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 指定别名 与 索引的映射
    @Test
    public void addAliases(){
        try {
            List<String> indexNameList = new ArrayList<>();
            indexNameList.add(ES_INDEX_NAME);
            indexNameList.add(ES_INDEX_NAME_PC);
            indexNameList.add(ES_INDEX_NAME_APP);
            Boolean flag = esService.addAliases(indexNameList, ES_ALIA_NAME);
            System.out.println(flag);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 别名不变 切换新的索引 在用
    @Test
    public void changeNewAliases(){
        try {
            // 索引变化
            // 老的索引
            List<String> indexOldNameList = new ArrayList<>();
            indexOldNameList.add(ES_INDEX_NAME);
            indexOldNameList.add(ES_INDEX_NAME_PC);
            indexOldNameList.add(ES_INDEX_NAME_APP);
            Boolean flag = esService.removeAliases(indexOldNameList, ES_ALIA_NAME);
            System.out.println("removeAliases indexOldNameList " + indexOldNameList.get(0) + " status is " + flag);

            // 新的索引 别名不变
            List<String> indexNewNameList = new ArrayList<>();
            indexNewNameList.add(ES_NEW_INDEX_NAME);
            indexNewNameList.add(ES_INDEX_NAME_PC);
            indexNewNameList.add(ES_INDEX_NAME_APP);
            Boolean flag1 = esService.addAliases(indexNewNameList, ES_ALIA_NAME);
            System.out.println("addAliases indexNewNameList " + indexNewNameList.get(0) + " status is " + flag1);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Test
    public void removeAliases(){
        try {
            // 索引变化
            // 老的索引
            List<String> indexOldNameList = new ArrayList<>();
            indexOldNameList.add(ES_INDEX_NAME_PC);
            indexOldNameList.add(ES_INDEX_NAME_APP);
            Boolean flag = esService.removeAliases(indexOldNameList, ES_ALIA_NAME);
            System.out.println("removeAliases indexOldNameList " + indexOldNameList.get(0) + " status is " + flag);


        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

当前别名 只放了一个索引,之前将数据分散放再多个索引  会有数据 查询后 排名不高的情况,已统一到一个索引了

--------------------------------------------------------

查询某个别名

GET /_alias/content_erp_nlp_help_alia

别名解除绑定

POST /_aliases
{
  "actions" : [
    {
      "remove" : {
        "index" : "content_erp_nlp_help202407231731",
        "alias" : "content_erp_nlp_help_alia"
      }
    }
  ]
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值