ElasticSeach JAVA API用于查找给定索引的别名

时间:2015-07-01 19:32:41

标签: java lucene elasticsearch

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

使用REST API非常简单

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

但是我无法通过Java API找到任何关于如何做到这一点的好参考

2 个答案:

答案 0 :(得分:3)

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

获取别名列表非常简单:

 client.admin().cluster()
    .prepareState().execute()
    .actionGet().getState()
    .getMetaData().aliases();

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

我的第一个实现看起来像这样:

    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();
        }
    }

我不喜欢它......在探索之后,我能够通过查看RestGetIndicesAliasesAction(包org.elasticsearch.rest.action.admin.indices.alias)来了解如何更有效地实现它。得到)

这就是我最终的结果:

    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

中指定的索引的别名

希望它有所帮助!

答案 1 :(得分:0)

以前的答案适用于ElasticSearch 2.x.但是,在ElasticSearch的5.x版本中,情况略有改变。

对于版本5.x来说,这对我有用:

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的用法示例:

@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);
}