首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成所有索引,同时只尝试获取与特定别名相关联的索引。

生成所有索引,同时只尝试获取与特定别名相关联的索引。
EN

Stack Overflow用户
提问于 2017-12-09 03:36:00
回答 1查看 908关注 0票数 1

我最近将应用程序从弹性搜索5.3.1升级到6.0。

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

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

代码语言:javascript
运行
复制
GetAliasesResponse r = client.admin().indices().getAliases(new 
GetAliasesRequest("givenalias")).actionGet();

但是在ES6.0之后,相同的片段给出了在系统中创建的所有索引。

理想情况下,它应该只返回那些与给定别名.Not其他索引相关联的索引。这是在弹性搜索5.3.1中进行的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-09 18:22:44

TL;DR:它是Elasticsearch Java中的一个意欲的破坏变化 (尽管在“6.0中的破坏更改”Java更改“页面中没有明确提到)。

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

在6.0中破坏REST中的更改

首先,我注意到在ElasticSearch6.0中REST的这一部分发生了变化。据报告,在别名方面有两项最新变化:

虽然没有提到任何关于OP的案子。

根据我在执行查询时所看到的,此查询在Elasticsearch 5中工作:

代码语言:javascript
运行
复制
GET /alias1/_aliases

在Elasticsearch 6中不起作用,从而产生以下错误:

代码语言:javascript
运行
复制
{
  "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之后,我成功地再现了完全相同的行为。

以下代码:

代码语言:javascript
运行
复制
GetAliasesResponse alias1 = client.admin().indices()
    .getAliases(new GetAliasesRequest("alias1")).actionGet();

在ES 5中,在IntelliJ调试器中产生这样的结果:

对于ES 6,我得到了以下信息:

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

跳入源代码

快速搜索elasticsearch代码库给了我最后的解释。在ES 5中,有一个测试testIndicesGetAliases,它检查为测试别名返回的索引列表是否正好有一个元素(IndexAliasesIT.java#L554):

代码语言:javascript
运行
复制
    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)

代码语言:javascript
运行
复制
    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那样远离它的黑暗角落。

感谢您的阅读。

希望这能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47725065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档