在尝试仅获取与特定别名

时间:2017-12-09 03:36:01

标签: elasticsearch

我最近将应用程序从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中有效。

1 个答案:

答案 0 :(得分:1)

TL; DR :这是Elasticsearch的{​​{3}}中的intended breaking change(虽然未在Java API页面中明确提及)。

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

6.0中的REST API中的更改

首先,我注意到在Elasticsearch 6.0中这部分REST API发生了变化。有两个报告打破有关别名的更改:

虽然没有提到有关OP案件的任何内容。

从我看到的查询中,此查询适用于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适用于两个版本并返回相同的结果。

此外,我没有在Indices aliases api resolves indices expressions only against indices的文档中找到GET /alias1/_aliases的示例,也没有5.6

重现错误

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

以下代码:

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

在ES 5中,在IntelliJ调试器中生成它:

6.0

对于ES 6,我有以下内容:

GetAliasesResponse in ES 5

如您所见,第二个输出中有额外的键,它们具有空值。

深入了解源代码

快速搜索elasticsearch代码库给了我最后的解释。在ES 5中有一个测试testIndicesGetAliases,它检查为测试别名返回的索引列表只有一个元素(GetAliasesResponse in ES 6):

    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#L554

    logger.info("--> getting alias1");
    GetAliasesResponse getResponse = admin().indices().prepareGetAliases("alias1").get();
    assertThat(getResponse, notNullValue());
    assertThat(getResponse.getAliases().size(), equalTo(5));

此更改是在IndexAliasesIT.java#L573中引入的,与这些问题有关:

这实际上很有意思,因为我们上面看到的一个报告的REST API突破性更改也破坏了一些Java API调用的兼容性。

你能做什么

短期内,您只需要过滤掉空值的那些键。

从长远来看,我认为自从Elastic计划迁移到版本7.0中的TransportClient _alias API no longer accepts index wildcards #25090以来,迁移到Java High Level REST Client是有意义的:

  

我们计划在Elasticsearch 7.0和中弃用TransportClient   在8.0中完全删除它。相反,您应该使用Java   高级REST客户端,它执行HTTP请求而不是   序列化的Java请求。

一般来说,Elasticsearch经常破坏兼容性,因此最好远离Java API的黑暗角落。

感谢阅读。

希望有所帮助!