gpt4 book ai didi

elasticsearch - 在尝试仅获取与特定别名关联的那些索引的同时,得出所有索引

转载 作者:行者123 更新时间:2023-12-02 23:22:21 26 4
gpt4 key购买 nike

我最近将应用程序从Elastic search 5.3.1升级到了6.0。

我的要求是获取与特定别名关联的所有索引。

我使用下面提到的代码片段来提取与特定别名相关的所有索引。该代码段在5.3.1中运行良好,并且仅给出与该特定别名关联的那些索引。

GetAliasesResponse r = client.admin().indices().getAliases(new 
GetAliasesRequest("givenalias")).actionGet();

但是在ES 6.0之后,相同的代码片段提供了系统中创建的所有索引。

理想情况下,它仅应返回与给定别名相关联的那些索引。这在Elastic search 5.3.1中有效。

最佳答案

TL; DR :这是Elasticsearch的intended breaking change中的Java API(尽管"Breaking changes in 6.0 » Java API changes"页面中未明确提及)。

以下是发现这一事实的故事。 (注意:原始答案已过大量编辑,因此注释可能已过时。)

在REST API 6.0中进行重大更改

首先,我注意到REST API的这一部分在Elasticsearch 6.0中进行了更改。报告了两个有关别名的重大更改:

  • GET /_aliases,_mappings 语法已删除,以支持GET /_aliases / GET /_mappings
  • Indices aliases api resolves indices expressions only against indices

  • 尽管未提及有关OP案件的任何内容。

    从我看到的执行查询的 Angular 来看,此查询在Elasticsearch 5中有效:
    GET /alias1/_aliases

    并且在Elasticsearch 6中不起作用,并出现以下错误:
    {
    "error": "Incorrect HTTP method for uri [/alias1/_aliases] and method [GET], allowed: [PUT]",
    "status": 405
    }

    有趣的是, GET /alias1/_alias在这两个版本中均可工作,并返回相同的结果。

    而且,我没有在nor 5.66.0的文档中找到 GET /alias1/_aliases的示例。

    重现错误

    在意识到OP实际上正在使用Java API之后,我设法重现了完全相同的行为。

    如下代码:
    GetAliasesResponse alias1 = client.admin().indices()
    .getAliases(new GetAliasesRequest("alias1")).actionGet();

    在ES 5中,这是在IntelliJ调试器中产生的:

    GetAliasesResponse in ES 5

    对于ES 6,我具有以下优势:

    GetAliasesResponse in ES 6

    如您所见,第二个输出中有多余的键,这些键的值为空。

    深入源代码

    快速搜索Elasticsearch代码库给了我最终的解释。在ES 5中,有一个测试 testIndicesGetAliases,它正在检查为测试别名返回的索引列表是否恰好具有一个元素( IndexAliasesIT.java#L554):
        logger.info("--> getting alias1");
    GetAliasesResponse getResponse = admin().indices().prepareGetAliases("alias1").get();
    assertThat(getResponse, notNullValue());
    assertThat(getResponse.getAliases().size(), equalTo(1));

    然后在6.0中检查大小是否为5! ( IndexAliasesIT.java#L573)
        logger.info("--> getting alias1");
    GetAliasesResponse getResponse = admin().indices().prepareGetAliases("alias1").get();
    assertThat(getResponse, notNullValue());
    assertThat(getResponse.getAliases().size(), equalTo(5));

    此更改是在 this commit中引入的,它与以下问题有关:
  • Remove comma-separated feature parsing for GetIndicesAction #24723
  • _alias API no longer accepts index wildcards #25090

  • 这实际上很有趣,因为我们上面看到的报告的REST API重大更改之一也破坏了某些Java API调用的兼容性。

    你可以做什么

    短期而言,您只需要筛选出具有空值的键即可。

    从长远来看,我认为迁移到 Java High Level REST Client是有意义的,因为Elastic计划将7.0版的TransportClient迁移到 deprecate:

    We plan on deprecating the TransportClient in Elasticsearch 7.0 and removing it completely in 8.0. Instead, you should be using the Java High Level REST Client, which executes HTTP requests rather than serialized Java requests.



    通常,Elasticsearch经常破坏兼容性,因此最好远离Java API之类的黑暗角落。

    谢谢阅读。

    希望有帮助!

    关于elasticsearch - 在尝试仅获取与特定别名关联的那些索引的同时,得出所有索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47725065/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com