我最近将应用程序从弹性搜索5.3.1升级到6.0。
我的要求是获取与特定别名相关的所有索引。
我使用下面提到的片段来获取与特定别名相关的所有索引。这段代码片段在5.3.1中运行良好,只给出了与该特定别名相关联的索引。
GetAliasesResponse r = client.admin().indices().getAliases(new
GetAliasesRequest("givenalias")).actionGet();但是在ES6.0之后,相同的片段给出了在系统中创建的所有索引。
理想情况下,它应该只返回那些与给定别名.Not其他索引相关联的索引。这是在弹性搜索5.3.1中进行的。
发布于 2017-12-09 18:22:44
TL;DR:它是Elasticsearch Java中的一个意欲的破坏变化 (尽管在“6.0中的破坏更改”Java更改“页面中没有明确提到)。
下面是发现这一事实的故事。(注:原来的答案经过了大量编辑,因此评论可能已经过时。)
在6.0中破坏REST中的更改
首先,我注意到在ElasticSearch6.0中REST的这一部分发生了变化。据报告,在别名方面有两项最新变化:
GET /_aliases,_mappings语法被删除以支持GET /_aliases/GET /_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在两个版本中都工作,并返回相同的结果。
此外,我没有在GET /alias1/_aliases的文档或5.6中找到一个6.0的例子,也没有找到6.0。
复制臭虫
在意识到OP实际上是在使用Java之后,我成功地再现了完全相同的行为。
以下代码:
GetAliasesResponse alias1 = client.admin().indices()
.getAliases(new GetAliasesRequest("alias1")).actionGet();在ES 5中,在IntelliJ调试器中产生这样的结果:

对于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));这一更改是在此承诺中进行的,它与以下问题相关:
这实际上很有趣,因为我们前面看到的REST中断更改之一也破坏了一些Java调用的兼容性。
你能做什么
在短期内,您只需要过滤掉那些带空值的键。
从长远来看,我认为迁移到Java高级REST客户端是有意义的,因为弹性计划在7.0版中使用不赞成 TransportClient:
我们计划在ElasticSearch7.0中取消推荐的TransportClient,并在8.0中完全删除它。相反,您应该使用客户机,它执行HTTP请求,而不是序列化Java请求。
一般来说,Elasticsearch经常破坏兼容性,所以最好像Java那样远离它的黑暗角落。
感谢您的阅读。
希望这能帮上忙!
https://stackoverflow.com/questions/47725065
复制相似问题