我最近将应用程序从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中有效。
答案 0 :(得分:1)
TL; DR :这是Elasticsearch的{{3}}中的intended breaking change(虽然未在Java API页面中明确提及)。
以下是发现这一事实的故事。 (注意:原始答案经过大量编辑,因此评论可能已过时。)
首先,我注意到在Elasticsearch 6.0中这部分REST API发生了变化。有两个报告打破有关别名的更改:
GET /_aliases
/ GET /_mappings
GET /_aliases,_mappings
虽然没有提到有关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调试器中生成它:
对于ES 6,我有以下内容:
如您所见,第二个输出中有额外的键,它们具有空值。
快速搜索elasticsearch代码库给了我最后的解释。在ES 5中有一个测试testIndicesGetAliases
,它检查为测试别名返回的索引列表只有一个元素():
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的黑暗角落。
感谢阅读。
希望有所帮助!