首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElasticSeach JAVA查找给定索引的别名

ElasticSeach JAVA查找给定索引的别名
EN

Stack Overflow用户
提问于 2015-07-01 19:32:41
回答 2查看 1.2K关注 0票数 2

如何使用Java在ElasticSearch中找到给定索引的别名?

通过使用REST,非常容易。

https://www.elastic.co/guide/en/elasticsearch/reference/1.x/indices-aliases.html#alias-retrieving

但是我找不到任何关于如何通过Java来做这件事的好参考。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-02 18:12:02

在使用ElasticSearch时,我遇到了一个问题,需要根据提供的索引获取别名列表。

虽然获取别名列表非常简单:

代码语言:javascript
复制
 client.admin().cluster()
    .prepareState().execute()
    .actionGet().getState()
    .getMetaData().aliases();

我很难找到一种简单的方法来获得给定索引的别名,而不必首先遍历所有内容。

我的第一个实现如下所示:

代码语言:javascript
复制
    ImmutableOpenMap<String, ImmutableOpenMap<String, AliasMetaData>> aliases = client.admin().cluster()
        .prepareState().execute()
        .actionGet().getState()
        .getMetaData().aliases();

    for (ObjectCursor<String> key: aliases.keys()) {
        ImmutableOpenMap<String, AliasMetaData> indexToAliasesMap = client.admin().cluster()
          .state(Requests.clusterStateRequest())
          .actionGet().getState()
          .getMetaData().aliases().get(key.value);

        if(indexToAliasesMap != null && !indexToAliasesMap.isEmpty()){
            String index= indexToAliasesMap.keys().iterator().next().value;
            String alias = indexToAliasesMap.values().iterator().next().value.alias();
        }
    }

我不喜欢..。在四处闲逛之后,我想出了一个如何通过查看org.elasticsearch.rest.action.admin.indices.alias.get)包(package RestGetIndicesAliasesAction )来更有效地完成任务的方法。

这就是我最后的结局:

代码语言:javascript
复制
    ClusterStateRequest clusterStateRequest = Requests.clusterStateRequest()
            .routingTable(false)
            .nodes(false)
            .indices("your_index_name_goes_here");

    ObjectLookupContainer<String> setAliases= client
            .admin().cluster().state(clusterStateRequest)
            .actionGet().getState().getMetaData()
            .aliases().keys();

您将能够为您在setAliases中指定的索引找到别名。

希望它能帮到别人!

票数 3
EN

Stack Overflow用户

发布于 2017-04-04 17:11:02

对于ElasticSearch 2.x,前面的答案是可以的。不过,在ElasticSearch的5.x版本中,情况略有变化。

对我来说,5.x版本就是这样的:

代码语言:javascript
复制
public Collection<String> findAliasForIndices(String... indices) {
    if(indices == null || indices.length == 0) {
        return Collections.emptyList();
    }
    ClusterStateRequest clusterStateRequest = Requests.clusterStateRequest()
            .routingTable(false)
            .nodes(false)
            .indices(indices);

    ImmutableOpenMap<String, IndexMetaData> aliasMap = client
            .admin().cluster().state(clusterStateRequest)
            .actionGet().getState().getMetaData()
            .getIndices();

    return StreamSupport.stream(aliasMap.spliterator(), false).flatMap((e) -> {
        Iterable<String> iterable = () -> e.value.getAliases().keysIt();
        return StreamSupport.stream(iterable.spliterator(), false);
    }).collect(Collectors.toSet());
}

此方法将所有别名作为索引集合的字符串返回。

JUnit和AssertJ的用法示例:

代码语言:javascript
复制
@Test
public void whenFindAliasForIndices_ShouldRetrieveIndices() throws IOException {
    String testIndex = "blah1";
    String alias1 = "alias1";
    createIndexWithAlias(testIndex, alias1);

    String testIndex2 = "blah2";
    String alias2 = "alias2";
    createIndexWithAlias(testIndex2, alias2);

    Collection<String> indices = adapter.findAliasForIndices(testIndex, testIndex2);
    assertThat(indices.contains(alias1)).isTrue();
    assertThat(indices.contains(alias2)).isTrue();
    adapter.deleteIndices(testIndex);
    adapter.deleteIndices(testIndex2);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31170105

复制
相关文章

相似问题

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