如何使用Java在ElasticSearch中查找给定索引的别名?
使用REST API非常简单
https://www.elastic.co/guide/en/elasticsearch/reference/1.x/indices-aliases.html#alias-retrieving
但是我无法通过Java API找到任何关于如何做到这一点的好参考
答案 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);
}