如何使用Java在ElasticSearch中找到给定索引的别名?
通过使用REST,非常容易。
https://www.elastic.co/guide/en/elasticsearch/reference/1.x/indices-aliases.html#alias-retrieving
但是我找不到任何关于如何通过Java来做这件事的好参考。
发布于 2015-07-02 18:12:02
在使用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();
}
}我不喜欢..。在四处闲逛之后,我想出了一个如何通过查看org.elasticsearch.rest.action.admin.indices.alias.get)包(package RestGetIndicesAliasesAction )来更有效地完成任务的方法。
这就是我最后的结局:
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中指定的索引找到别名。
希望它能帮到别人!
发布于 2017-04-04 17:11:02
对于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);
}https://stackoverflow.com/questions/31170105
复制相似问题